我的应用程序有一个服务,直到用户按下退出按钮。我知道在android中提供退出按钮不是很好的设计,但在我的应用程序中它是理想的。
在我的应用程序中,我还有一个线程来发送Http请求,下载一个文件,然后在后台解析它,这样UI就不会阻塞。在我的线程的run方法中有顺序步骤(比如下载文件,然后解析它),其中没有while或for循环。
当用户按下退出按钮时,如果后台线程在没有kill进程的情况下运行(使用Process.kiil(pid)或System.exit(0)),有没有办法停止后台线程?
我也尝试过AsyncTask。无论在run的run方法中,我把它放在doInBackground方法中。当用户按下退出按钮时,我已取消asynctask。取消任务不会完全停止后台线程,因为在文件下载之后它将进入解析器来解析文件(即解析是在后台线程中完成的,但是在解析时它不在doInBackground或run方法中。它将在解析方法中解析器类或在默认处理程序类中进行解析。)
从谷歌搜索我读了很多关于线程的博客和其他stackoverflow问题,但我仍然无法找到任何解决方案。 请帮助....提前感谢..
答案 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());