Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
android:如何停止和启动线程(带有错误代码示例)_Android_Multithreading - Fatal编程技术网

android:如何停止和启动线程(带有错误代码示例)

android:如何停止和启动线程(带有错误代码示例),android,multithreading,Android,Multithreading,我试图在应用程序中创建一个线程。代码如下: private class GetFileTask extends Thread { private volatile boolean mKeepRunning = false; public GetFileTask() { super("GetFileTask"); } /** Cancel task */ public void cancel() { mKee

我试图在应用程序中创建一个线程。代码如下:

private class GetFileTask extends Thread {
    private volatile boolean mKeepRunning = false;
    public GetFileTask() {
        super("GetFileTask");         
    }
    /** Cancel task */
    public void cancel() {
        mKeepRunning = false;
        interrupt();
    }
    @Override
    public void run() {
        mKeepRunning = true;
        while (true) {
            try {
              doTask();
              Sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (!mKeepRunning) {
                break;
            }
        }
    }
    private void doTask() {
    }    
}
我尝试让用户取消下载(取消线程),然后再从零开始下载(重新启动线程)。我读过android sdk文档,我知道我不应该使用暂停/挂起。我试图通过调用
cancel()来取消线程
并尝试通过调用
run()重新启动线程
但是,当我调用
run()时,我的应用程序挂起


那么,基于上面的代码示例,停止线程和重启线程的正确方法是什么

应该调用GetFileTask.start(),这将导致在线程中执行run()方法

直接调用GetFileTask.run()只会在调用线程上执行该代码,这不是您想要的,因为Sleep()(以及任务本身所需的时间)会阻塞调用线程


编辑:请注意,在同一线程实例上再次调用start()是不合法的。

我不明白为什么应用程序应该挂起。除非doTask正在做一些愚蠢的事情。我想我已经通过调用cancel()停止了run(),所以while循环被破坏了。因此,当我再次调用run()时,线程没有处于睡眠状态all@ChrisStratton同意。他应该调用
GetFileTask.start()
并且他正在调用
sleep
,在这种情况下,中断状态将被清除,它将收到一个
InterruptedException
。因此调用
interrupted()
将返回true?。那么它会接收到中断异常吗?。。文档澄清了我的疑问。@Raghunandan-海报并没有中断线程,而是通过否定volatile标志变量mKeepRunning发出信号,使其退出while循环。但是,根据您链接的文档,第二次调用start()是不合法的。