Java 线程已停止时已在运行
在我的下载管理器中,当活动暂停或停止时,我会自动暂停下载。任何正在运行的下载都会被中断。我知道我应该让它在后台下载,但这不是重点 问题是,在恢复时,下载必须继续。然而,我得到一个例外,线程已经在运行,当我在logcat中放置一个日志时,它清楚地表明线程被中断 指向的行是负责运行线程的Java 线程已停止时已在运行,java,android,multithreading,Java,Android,Multithreading,在我的下载管理器中,当活动暂停或停止时,我会自动暂停下载。任何正在运行的下载都会被中断。我知道我应该让它在后台下载,但这不是重点 问题是,在恢复时,下载必须继续。然而,我得到一个例外,线程已经在运行,当我在logcat中放置一个日志时,它清楚地表明线程被中断 指向的行是负责运行线程的调度程序类: public class Scheduler extends TimerTask { private static int index = 0; //------------------
调度程序
类:
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;
}
}
}
//------------------------------------------------------------------------------
}
最后一行显示调度程序正在启动线程。它将以与日志显示相同的方式启动。设置路径、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)
为了更好地控制线程的生命周期,请不惜任何代价避免使用工作线程,而使用AsyncTask。有效代码?如何发布8门课程的SSCCE?伙计,这太荒谬了。我没有发布有问题的代码吗?我们没有责任为您将代码简化为问题。@LittleChild:毫不奇怪,当人们告诉您您问了一个他们不可能回答的问题时,如果您只是再次问这个问题,他们会有点生气。欢迎与人类而不是机器打交道。修复您的代码示例,然后再试一次。@LittleChild-如果一个线程已死亡,您应该将其带到一个安静的地方并将其掩埋。如果你愿意的话,开始一个新的,但不要期望一个死去的会复活。听起来你应该使用线程池。@OldCurmudgeon你是个脾气不那么暴躁的人,尽管你的名字不是这么说的。:-)+1对于一些对我有意义的事情:)基本上,您只能在esure上调用start(),AsyncTask
是一个选项,但我想知道为什么会发生这种情况。如何解决这个问题取决于线程的启动和停止位置;如果UI正在更改(方向、导航等),则线程可能会卡住或运行多个实例。如果希望与UI通信或在主线程中管理它们,那么工作线程不是一个好主意。
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)