2013-08-21 147 views
0

在我的下载管理器中,当活动暂停或停止时,我会自动暂停下载。任何运行的下载都会中断。我知道我应该让它下载,即使在后台,但这不是重点。线程已经停止运行

事情是,在简历中,下载必须继续。但是,我得到了一个异常,即在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()是罪魁祸首。 为什么?我不知道为什么。

那么logcat是什么?

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

有效代码?我如何发布8个课程的SSCCE?男人,这是荒谬的。我没有发布有问题的代码吗? –

+4

我们没有责任将您的代码减少到适合您的问题。 – Puppy

+0

@DeadMG足够公平,但这也不是“接近”投票的理由。是否提供的代码不够? :) –

回答

1

避免使用辅助线程任何费用,使用的AsyncTask而不是为更好地控制线程的生命周期。

+0

当然,'AsyncTask'是一个选项,但我只想知道为什么会发生这种情况。它怎么能被解决 –

+0

取决于你的线程在哪里启动和停止;如果UI正在改变(方向,导航,任何),你的线程可能会卡住或运行多个实例。如果您想与UI进行通信或在主线程中管理它们,工作线程并不是一个好主意。 – CristianGuerrero