2012-03-28 73 views
0

我的应用程序有一个服务运行,直到用户按下退出按钮。我知道在android中给出退出按钮并不是很好的设计,但在我的应用程序中它是理想的。有没有办法阻止后台线程没有进程杀死Android?

在我的应用程序中,我也有一个线程发送Http请求,下载一个文件,然后在后台解析它,以便UI不会阻塞。在我的线程运行方法中,有连续的步骤(如下载文件,然后解析它),没有while或for循环。

当用户按下退出按钮,有没有办法停止后台线程,如果它正在运行没有杀死进程(使用Process.kiil(PID)或System.exit(0))?

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

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

回答

0

的情况下(当退出事件从UI发生)停止线程也不是没有可能使用

Process.killProcess(Process.myPid()); 
0

每一步之前,你可以添加一行

if(stillRunning){ 
//next step 
} 

,当你想让它停下来,您只需设置stillRunning为false。

+0

但它是如何可能的XML解析器(如[这里](HTTP默认处理程序的子类的每一个环节: //www.ibm.com/developerworks/cn/opensource/library/x-android/index.html)( 清单6. SAX处理程序) – 2012-03-28 07:03:42

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(); 

停止,并呼吁停止on myThread

+0

但使用stop方法时要小心阅读本文http://stackoverflow.com/questions/680180 /哪里停止销毁线程在Android的服务类,也是这个http://stackoverflow.com/questions/94011/how-to-abort-a-thread-in-a-fast -and-clean-way-in-java – vipin 2012-03-28 07:05:49

+0

第一个选项它不会停止后台线程,它会完成只有活动。并为线程的第二个选项stop()方法进行了deprycated。 – 2012-03-28 07:06:10

+0

第一个不是用于阻止你的线程它是你正在使用出口这是不是一个好的做法使用在你想关闭应用程序的出口的地方 – vipin 2012-03-28 07:08:19

0

可能地,您的连接和解析器使用相同的InputStream。如果您退出,请尝试关闭流和连接。在这种情况下,会抛出某种异常,并且后台线程会以错误结束工作,但速度非常快。如果您处于保存文件的中间位置,则必须检查每个写入(缓冲区),如果您被取消或尝试关闭FileOutputStream。

+0

没有两个使用是不同的流。 – 2012-03-28 07:25:00

+0

所以两个都:) – 2012-03-28 07:38:00

相关问题