启动后台线程的问题

时间:2011-05-30 16:18:02

标签: android multithreading

我有一个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> {


}

问题:我应该在哪里停止我的线程,一旦我离开活动就停止从数据库中检索数据......然后我又回来了!!?

2 个答案:

答案 0 :(得分:2)

您可以将任务分配给实例字段,并在调用取消之前将其检查为空。

在您的活动类中(不是onCreate()方法)

InitTask initTask=null;
onPause()

中的

if (initTask!=null) {
    initTask.cancel(true);
    initTask=null;
 }

休息是一样的。

答案 1 :(得分:0)

为什么你仍然无法访问你的init_task?在您的方案中,取消您在侦听器中创建的AsyncTask实例没有任何明显的限制。

要处理重新启动,您可以保存一些标记并在恢复活动后继续提取。