5

I have created an AsyncTask and I have to create an while(true) on my AsyncTask.

How can I execute such an unbounded loop upon handling a button click in my Activity class without blocking?

4

3 回答 3

4

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

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

在你的试试这个doInBackground()

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


}

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

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

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

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

于 2013-05-27T14:23:46.097 回答
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) {
         ...
    }
 }
于 2013-01-22T15:25:15.000 回答
0

您可以将循环放在doInBackground()AsyncTask 的方法中。作为建议,您可以将 AsyncTask 添加为 Activity 中的内部类。这样您就可以轻松访问在 Activity 中声明的变量。尽管 android 文档建议仅将 AsyncTask 用于短任务。更明智的做法是创建一个可运行对象并将您while looprun()方法放入方法中并使用执行它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

于 2013-01-22T15:15:36.750 回答