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?
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?
其他人如何说没有中断条件的无限循环并不是一个好的用户体验。首先为您的 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()
并且可以为您自己的目的被覆盖。
如果您不喜欢这样,请将您的任务放在服务中。
正如其他人所说,您应该将“无限循环”放在 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) {
...
}
}
您可以将循环放在doInBackground()
AsyncTask 的方法中。作为建议,您可以将 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