Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程已停止时已在运行_Java_Android_Multithreading - Fatal编程技术网

Java 线程已停止时已在运行

Java 线程已停止时已在运行,java,android,multithreading,Java,Android,Multithreading,在我的下载管理器中,当活动暂停或停止时,我会自动暂停下载。任何正在运行的下载都会被中断。我知道我应该让它在后台下载,但这不是重点 问题是,在恢复时,下载必须继续。然而,我得到一个例外,线程已经在运行,当我在logcat中放置一个日志时,它清楚地表明线程被中断 指向的行是负责运行线程的调度程序类: public class Scheduler extends TimerTask { private static int index = 0; //------------------

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

问题是,在恢复时,下载必须继续。然而,我得到一个例外,线程已经在运行,当我在logcat中放置一个日志时,它清楚地表明线程被中断

指向的行是负责运行线程的
调度程序
类:

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)