我有一个Activity类,它有一个EditText字段。每次用户输入2个以上的字母时,我都会使用StartService()搜索国家/地区名称列表来启动服务。此服务使用 -
启动后台/工作线程AsyncTask backgoundTask = new AsyncTask;
backgoundTask.execute(givenString);
在AsyncTask类的doInBackground()函数中,我开始搜索包含这两个字母的国家/地区名称列表。
protected Void doInBackground(String[] objects) {
Log.i("doInBackground()",Thread.currentThread().getName());
//code to check if country name contains those two/more letters
return null;
}
问题我有 - 假设我键入两个字母,服务启动,开始在国家/地区名称列表中搜索。然后我键入第3个字母,然后再次点击服务,再次搜索国家/地区名称列表,而另一个正在进行中。搜索不会同时运行。首先搜索输入2个字母,然后继续输入3个字母。
我需要的是 - 如果搜索已经进行,则停止该搜索并使用新的字母集重新开始。 例如 - 如果搜索已经输入2个字母输入,当用户输入第3个字母时,用2个字母停止上一个搜索并以3个字母开头。
我试过 - 当输入超过2个字母然后startService()时,首先调用stopService()。但它没有用。我可以在Logcat中看到,搜索遍历完整的国家/地区名称列表,然后再查看3个字母。
我正在使用已启动的服务。我正在考虑使用意向服务。任何建议都非常感谢。谢谢。
********* - 的更新 - ************
感谢所有人建议使用backgroundtask.cancel()。这就是我做的 -
@Override
protected void onCancelled() {
super.onCancelled();
Log.i("onCancelled()",Thread.currentThread().getName());
//findHost(objects[0]);
}
@Override
protected Void doInBackground(String[] objects) {
Log.i("doInBackground()",Thread.currentThread().getName());
if(backgoundTask.isCancelled()){
findCountry(objects[0]);
}else{
backgoundTask.cancel(true);
Log.i("Running()","Background task running again");
findCountry(objects[0]);
}
return null;
}
但该服务仍在搜索国家/地区名称两次或用户输入的时间超过2个字母。
答案 0 :(得分:0)
虽然您正在尝试停止服务,但异步任务仍在线程上处于活动状态。您还需要确保调用backgoundTask.cancel(true)
,可能还需要使用服务的onStop()
方法。
答案 1 :(得分:0)
在开始新任务之前,始终使用cancel()来停止AsyncTask:
backgoundTask.cancel(true);
documentation of AsyncTask提供了“取消任务”中的详细信息。部分:
可以随时通过调用 取消(布尔) 取消任务。 调用此方法将导致后续调用 isCancelled() 返回true。调用此方法后, onCancelled(Object) ,而不是 之后将调用 onPostExecute(Object) doInBackground(Object []) 返回。确保取消任务 你应该尽快检查返回值 isCancelled()定期从 doInBackground(Object []) ,如果可能的话 (例如在循环内部。)