有没有办法在Android中没有进程终止的情况下停止后台线程?

时间:2012-03-28 06:43:41

标签: java android multithreading

我的应用程序有一个服务,直到用户按下退出按钮。我知道在android中提供退出按钮不是很好的设计,但在我的应用程序中它是理想的。

在我的应用程序中,我还有一个线程来发送Http请求,下载一个文件,然后在后台解析它,这样UI就不会阻塞。在我的线程的run方法中有顺序步骤(比如下载文件,然后解析它),其中没有while或for循环。

当用户按下退出按钮时,如果后台线程在没有kill进程的情况下运行(使用Process.kiil(pid)或System.exit(0)),有没有办法停止后台线程?

我也尝试过AsyncTask。无论在run的run方法中,我把它放在doInBackground方法中。当用户按下退出按钮时,我已取消asynctask。取消任务不会完全停止后台线程,因为在文件下载之后它将进入解析器来解析文件(即解析是在后台线程中完成的,但是在解析时它不在doInBackground或run方法中。它将在解析方法中解析器类或在默认处理程序类中进行解析。)

从谷歌搜索我读了很多关于线程的博客和其他stackoverflow问题,但我仍然无法找到任何解决方案。 请帮助....提前感谢..

4 个答案:

答案 0 :(得分:0)

在每个步骤之前,你可以添加一行像

if(stillRunning){ 
//next step
}

当你希望它停止时,你只需将stillRunning设置为false。

答案 1 :(得分:0)

(1)使用它来停止应用而不是退出

            finish();
    Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    startActivity(intent);

(2)使用新线程代替asynk任务,可以通过调用stop方法停止

            Thread myThread = new Thread ()
        {
            public void run()
            {
                Looper.prepare();
                doMyWork();
            }


        }.start();

并在myThread上调用stop

答案 2 :(得分:0)

您的连接和解析器可能使用相同的InputStream。如果退出,请尝试关闭流和连接。在这种情况下,将抛出某种异常,后台线程将以错误但非常快的速度完成作业。如果您正在保存文件,则必须检查每个写入(缓冲区)是否被取消或尝试关闭FileOutputStream。

答案 3 :(得分:0)

如果不使用

,则无法在实例处停止线程(当从UI发生退出事件时)
Process.killProcess(Process.myPid());