我有一个backgorund线程,它扩展了AsyncTask,我在activity中使用它来读取数据库中的一些数据。
我使用这个后台线程,因为需要检索大量数据而不能阻止我的应用。
通常我会以这种方式启动线程:
public void onResume(){
init_task.execute(db);
}
public class InitTask extends AsyncTask<DBAdapter, GeoPoint, Void> {
...some code here....
}
protected void onPause() {
init_task.cancel(true);
super.onPause();
}
关键是我在onResume()中启动线程并在onPause()中取消它
但现在我遇到了另一个问题。
我有一个显示下拉列表的自动完成功能,当我点击其中一个条目时,我想启动后台线程(我现在从DB检索的数据取决于我点击的项目。)
好吧,我已经实现了一个监听器,我在那里启动了线程....问题是监听器是onCreate()所以我不能在onCReate()....中使用onResume()。 / p>
现在我的问题是我不知道如何停止线程,因为一旦我离开活动它仍然从我的数据库中检索数据......我希望它停止。
以下是我的代码示意图:
public void onCreate(Bundle savedInstanceState){
textView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
init_task = new InitTask();
init_task.execute(db);
}
});
}
public class InitTask extends AsyncTask<DBAdapter, GeoPoint, Void> {
}
问题:我应该在哪里停止我的线程,一旦我离开活动就停止从数据库中检索数据......然后我又回来了!!?
答案 0 :(得分:2)
您可以将任务分配给实例字段,并在调用取消之前将其检查为空。
在您的活动类中(不是onCreate()方法)
InitTask initTask=null;
onPause()中的
if (initTask!=null) {
initTask.cancel(true);
initTask=null;
}
休息是一样的。
答案 1 :(得分:0)
为什么你仍然无法访问你的init_task?在您的方案中,取消您在侦听器中创建的AsyncTask实例没有任何明显的限制。
要处理重新启动,您可以保存一些标记并在恢复活动后继续提取。