如何在不阻止活动的情况下在异步任务中创建一个while(true)?

时间:2013-01-22 15:01:12

标签: android android-asynctask android-activity

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

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

3 个答案:

答案 0 :(得分:4)

其他人如何说没有休息条件的无限循环不是一个很好的用户体验。 首先获取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(),并且可以为了您自己的目的而覆盖。

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

答案 1 :(得分:1)

正如其他人所说,你应该把你的'无限循环'放在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) {
         ...
    }
 }

答案 2 :(得分:0)

您可以将循环放在AsyncTask的doInBackground()方法中。作为建议,您可以将AsyncTask添加为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