【问题标题】:How to create a while(true) in a AsyncTask whithout blocking the Activity?如何在不阻塞 Activity 的情况下在 AsyncTask 中创建 while(true)?
【发布时间】:2013-01-22 15:01:12
【问题描述】:

我创建了一个AsyncTask,我必须在我的AsyncTask 上创建一个while(true)

如何在处理我的 Activity 类中的按钮单击时执行这样的无限循环而不阻塞?

【问题讨论】:

  • doInBackground() 是线程方法,所以在那里做。不过,AsyncTask 确实不打算以这种方式使用,因此使用标准 Java 线程可能会更好,或者重组逻辑,这样您就不会使用无限循环。特别是因为如果用户退出应用程序,您绝对需要一种杀死线程的方法。
  • 请省略 java android 前缀。每个人都知道 android 通常是用 java 编写的,并且与 android 的关系在您的标签上可见。并记住接受有用的答案。您的 5 个问题均未接受。

标签: android android-asynctask android-activity


【解决方案1】:

其他人怎么说没有中断条件的无限循环不是一个好的用户体验。 首先为您的 AsyncTask 获取一个实例:

 PostTask pt = new PostTask(this);
 pt.execute();

在您的 doInBackground() 中试试这个:

while(!this.isCancelled()){
    // doyourjobhere


}

如果应用程序被用户关闭,则必须在您的 onPause() 中停止 AsyncTask。

@Override
public void onPause(){
    pt.cancel(false);  
}

AsyncTask.cancel(boolean)isCancelled() 设置为true,调用AsyncTask.onCanceled() 方法而不是onPostExecute(),并且可以根据您自己的目的被覆盖。

如果您不喜欢这样,请将您的任务放入服务中。

【讨论】:

    【解决方案2】:

    正如其他人所说,您应该将“无限循环”放在 AsyncTask 的 doInBackground() 方法中。 但是,这个循环并不是无限的,因为它必须在您存在活动或应用程序时结束。 我建议将您的 while (true) { } 更改为 while (! mustStop) { } 并将布尔 mustStop 设置为您的活动的实例变量。因此,您可以通过设置 mustStop=true 来彻底停止进程(最好在 onPause 方法中设置它)。

    所以这将是:

    public class AsyncBigCalculActivity extends Activity {
    
    private boolean mustStop = false;
    
    @Override
    public void onPause() {
        super.onPause();
        mustStop=true; // Stop the infinite loop
    }
    
    ....
    
    @Override
     protected String doInBackground(String... params) {
        mustStop=false;
        while (!mustStop) {
             ...
        }
     }
    

    【讨论】:

      【解决方案3】:

      您可以将循环放在 AsyncTask 的 doInBackground() 方法中。作为建议,您可以将 AsyncTask 添加为 Activity 中的内部类。这样您就可以轻松访问在 Activity 中声明的变量。尽管 android 文档建议仅将 AsyncTask 用于短任务。最好创建一个可运行的对象并将while loop 放在run() 方法中并使用ExecutorService 执行它,这样您就可以在android 中以线程安全的方式运行异步代码。

      http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

      http://developer.android.com/reference/java/util/concurrent/ExecutorService.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-17
        • 2018-05-07
        相关资源
        最近更新 更多