Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 启动后台线程时出现问题_Android_Multithreading - Fatal编程技术网

Android 启动后台线程时出现问题

Android 启动后台线程时出现问题,android,multithreading,Android,Multithreading,我有一个backgorund线程,它扩展了AsyncTask,我在活动中使用它从数据库中读取一些数据 我使用这个后台线程是为了不让我的应用程序因为需要检索大量数据而被阻止 通常我是这样开始线程的: public void onResume(){ init_task.execute(db); } public class InitTask extends AsyncTask<DBAdapter, GeoPoint, Void> { ...some code here...

我有一个backgorund线程,它扩展了AsyncTask,我在活动中使用它从数据库中读取一些数据

我使用这个后台线程是为了不让我的应用程序因为需要检索大量数据而被阻止

通常我是这样开始线程的:

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();
    }
public void onResume(){
init_task.execute(db);
}
公共类InitTask扩展了异步任务{
…这里有一些代码。。。。
}
受保护的void onPause(){
初始化任务。取消(true);
super.onPause();
}
关键是我在onResume()中启动线程,并在onPause()中取消它

但现在我有一个不同的问题

我有一个autocomplete,它显示一个下拉列表,当我单击其中一个条目时,我想启动反向线程(我现在从DB检索的数据取决于我单击的项目)

为此,我实现了一个侦听器,并在那里启动了线程……问题是侦听器是onCreate(),所以我不能在onCreate()中使用onResume()

现在我的问题是,我不知道如何停止线程,因为一旦我离开活动,它仍然从我的数据库检索数据…我希望它停止

下面是我的代码图:

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> {


}
public void onCreate(Bundle savedInstanceState){
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
init_task=新的InitTask();
init_task.execute(db);
}
});
}
公共类InitTask扩展了异步任务{
}

问题:我应该在哪里停止我的线程,这样一旦我离开活动,它就停止从数据库检索数据……在我回来后,它会再次启动

为什么您仍然无法访问初始任务?在您的方案中,对于取消在侦听器中创建的AsyncTask实例没有任何可见的限制


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

您可以将任务分配给实例字段,并在调用cancel之前检查其是否为null

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

在onPause()中


Rest是一样的。

Ya,…没有限制,但我应该在哪里取消它???因为我尝试在onDestroy()中取消它,但它仍然没有被取消,我仍然从DB中检索数据???问题是:在哪里取消它?你对实例字段意味着什么,因为我没有得到它…我对这很陌生!你能举一个小例子来说明你的意思吗?这样我就可以理解了。但是我在onCreate()中启动我的线程……你说在onCreate()中启动它是可以的,只是这一行:InitTask InitTask=null;应该在我的活动中???我做对了?是的,没关系。确保不要在方法中第二次声明initTask。我认为这很好。这里有一个额外的要点和您的接受。干杯:)
InitTask initTask=null;
if (initTask!=null) {
    initTask.cancel(true);
    initTask=null;
 }