我创建了AsyncTask
,我必须在while(true)
上创建AsyncTask
。
如何在不阻止我的Activity类中处理按钮单击时执行这样的无界循环?
答案 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