不推荐在Android中停止线程

时间:2016-01-13 21:14:20

标签: android multithreading

我正在开发一个Android项目,我有一个帖子发布到PHP API并检查响应。

在线程开始之前,我会显示一个可以取消的进度对话框。按下取消时,我拨打thread.stop(),但这显示为已弃用。

我在Google上找到的所有内容都表明我有一个标志并检查while循环中的标志并干净利落地出来,但是在我的情况下没有循环,所以我应该怎么做呢? / p>

1 个答案:

答案 0 :(得分:1)

您遇到的问题是因为threads are not supposed to be stopped by calling thread.stop();方法而知道问题。

Android也不鼓励在Android中使用Java Threads,而且方便的是,Android在Threads之间进行通信时还有一些额外的支持,Handler类提供了一个整齐的排队消息机制,而Looper提供了一个方便的方法来处理它。

但正如您所提到的,您希望显示可以取消的进度对话框。按下取消时,可以使用AsyncTask实现此类功能。

由于AsyncTask是在Android中实现并行性的最简单方法之一,而无需处理更复杂的方法,如Threads。 虽然它提供了与UI线程基本的并行度,但它不应该用于更长的操作(例如,不超过2秒)。

  

主要是AsyncTask应该处理你的问题,因为:

     
      
  1. 它提供了简单且标准的推荐机制来发布后台进度(请参阅此处的用法部分:   http://developer.android.com/reference/android/os/AsyncTask.html
  2.   
  3. 它提供方法取消(布尔);取消任务(请参阅此处的取消任务部分:   http://developer.android.com/reference/android/os/AsyncTask.html
  4.   

AsyncTask有四种方法来完成任务:

onPreExecute();
doInBackground();
onProgressUpdate();
onPostExecute();

cancel();方法来处理后台工作的取消。

doInBackground()是最重要的,因为它是执行后台计算的地方。

<强>代码: 这是一个带有解释的骨架代码大纲:

public class AsyncTaskTestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);  

        // This starts the AsyncTask
        // Doesn't need to be in onCreate()
        new DownloadFilesTask().execute(url1);
    }

    // Here is the AsyncTask class:
    //
    // AsyncTask<Params, Progress, Result>.
    //    Params – the type (Object/primitive) you pass to the AsyncTask from .execute() 
    //    Progress – the type that gets passed to onProgressUpdate()
    //    Result – the type returns from doInBackground()
    // Any of them can be String, Integer, Void, etc. 

    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
     int count = urls.length;
     long totalSize = 0;
     for (int i = 0; i < count; i++) {
         totalSize += Downloader.downloadFile(urls[i]);
         publishProgress((int) ((i / (float) count) * 100));
         // Escape early if cancel() is called
         if (isCancelled()) break;
     }
     return totalSize;
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
 }
 }
}

有关更深入的知识,请访问以下链接:

https://blog.nikitaog.me/2014/10/11/android-looper-handler-handlerthread-i/ http://developer.android.com/reference/android/os/AsyncTask.html