2013-08-21 5 views
0

В диспетчере загрузки я автоматически приостанавливаю загрузку, когда действие приостановлено или остановлено. Любые загружаемые загрузки прерываются. Я знаю, что я должен позволить ему скачать даже в фоновом режиме, но здесь дело не в этом.Thread уже работает, когда он уже остановлен

Дело в том, что в резюме загрузка должна быть продолжена. Тем не менее, я получаю исключение, что поток уже запущен, когда в logcat у меня есть журнал, который я разместил, который явно говорит, что поток прерывается.

линия указывает на это в Scheduler класса, который отвечает за функционирование темы:

public class Scheduler extends TimerTask { 
    private static int index = 0; 
    //------------------------------------------------------------------------------ 
     @Override 
     public void run() { 
      if(Sharable.isResumed()){ // activity is ready for interaction with user 
       if(Sharable.getShouldLook()){ // and we are ready to download 
        while(index < Sharable.downloads.size()){ 
         Task t = Sharable.downloads.get(index++); 
         Log.v("SCHEDULER", "CHECKING"); 
         if(t.getReadiness()==true && t.getProgress() != 100){ 
          Log.v("TASK-- ", t.toString() + " is not running. Now starting"); 
          if(!t.isAlive()){ // check if not already running 
           t.start(); // start the thread 
          } 
          break; 
         } 
        } 
        index = 0; 
       } 
      } 
     } 
    //------------------------------------------------------------------------------ 
    } 

t.start() является виновником. ПОЧЕМУ? Я не знаю почему.

Так что же находится в ловушке?

08-21 15:50:54.316: V/TASKPATH(1460): /sdcard/tqa-se3ep47.mp3 
08-21 15:50:54.386: V/TASK(1460): SETTING PATH 
08-21 15:50:54.437: V/TASK(1460): MAKING URL 
08-21 15:50:54.437: V/TASK(1460): MAKING CONNECTION 
08-21 15:50:54.466: V/TASK(1460): Range:bytes=16636099- 
08-21 15:50:54.466: V/TASK(1460): BYTES-WRITTEN: 16636099 
08-21 15:50:54.514: V/TASK(1460): CONTENT-LENGTH: 27452333 
08-21 15:50:55.326: V/TASK(1460): CONNECTED 
08-21 15:50:56.886: V/TASK(1460): CODE: 206 
08-21 15:50:56.886: V/TASK(1460): Partial Content 
08-21 15:50:56.896: V/TASK(1460): Writing at location 16636099 

.... some useless logs skipped for sake of sanity .... 
08-21 15:51:00.986: V/TASK(1460): Writing at location 16763075 
08-21 15:51:01.036: V/TASK(1460): 61.0 
08-21 15:51:01.046: V/TASK(1460): Writing at location 16765123 
08-21 15:51:01.056: V/TASK(1460): 61.0 
08-21 15:51:01.196: V/TASK(1460): Writing at location 16767171 
08-21 15:51:01.196: V/TASK(1460): 61.0 
08-21 15:51:01.246: V/TASK(1460): Writing at location 16769219 
08-21 15:51:01.246: V/TASK(1460): 61.0 
08-21 15:51:01.266: V/TASK(1460): Writing at location 16771267 
08-21 15:51:01.286: V/TASK(1460): 61.0 
08-21 15:51:01.426: V/TASK(1460): Writing at location 16773315 
08-21 15:51:01.437: V/TASK(1460): 61.0 
08-21 15:51:01.486: V/TASK(1460): Writing at location 16775363 
08-21 15:51:01.516: V/TASK(1460): 61.0 
08-21 15:51:01.546: V/TASK(1460): Writing at location 16777411 
08-21 15:51:01.546: V/TASK(1460): 61.0 
08-21 15:51:01.586: V/TASK(1460): Writing at location 16779459 
08-21 15:51:01.586: V/TASK(1460): 61.0 
08-21 15:51:01.616: V/TASK(1460): Writing at location 16781507 
08-21 15:51:01.616: V/TASK(1460): 61.0 
08-21 15:51:01.676: V/TASK(1460): Writing at location 16783555 
08-21 15:51:01.887: V/TASK(1460): 61.0 
08-21 15:51:02.106: V/TASK(1460): INTERRUPTED 
08-21 15:51:12.319: V/TASK--(1460): tqa-se3ep47.mp3 is not running. Now starting 

Последняя строка показывает, что планировщик запускает поток. Он начнется так же, как показывает журнал. Укажите путь, URL и т. Д. Это то, что происходит в onResume(). Если бы я закрыл и перезапустил приложение, все будет хорошо.

Журнал ошибок:

08-21 15:51:12.355: E/AndroidRuntime(1460): FATAL EXCEPTION: Scheduler 
08-21 15:51:12.355: E/AndroidRuntime(1460): java.lang.IllegalThreadStateException: Thread already started. 
08-21 15:51:12.355: E/AndroidRuntime(1460):  at java.lang.Thread.start(Thread.java:1045) 
08-21 15:51:12.355: E/AndroidRuntime(1460):  at com.example.simpledownloader.scheduler.Scheduler.run(Scheduler.java:23) 
08-21 15:51:12.355: E/AndroidRuntime(1460):  at java.util.Timer$TimerImpl.run(Timer.java:284) 
+0

Действительный код? Как отправить SSCCE из 8 классов? Человек, это абсурдно. Разве я не опубликовал проблематичный код? –

+4

Мы не несем ответственность за то, чтобы сократить ваш код до проблемы для вас. – Puppy

+0

@DeadMG Достаточно честный, но это также не является основанием для голосования 'close'. недостаточно ли кода? :) –

ответ

1

Избегайте любой ценой, используя рабочие потоки, использовать AsyncTask вместо лучшего контроля жизненного цикла потока.

+0

Конечно, 'AsyncTask' - это вариант, но я просто хотел бы знать, почему это произошло. Как это могло быть разрешено? –

+0

В зависимости от того, где ваш поток запущен и остановлен; если пользовательский интерфейс изменен (ориентация, навигация, что угодно), ваш Thread может застрять или запускать несколько экземпляров. Рабочие потоки не являются хорошей идеей, если вы хотите общаться с пользовательским интерфейсом или управлять ими в основном потоке. – CristianGuerrero

Смежные вопросы