[英]How to stop background/worker thread and start again?
我有一个Activity类,其中有一个EditText字段。 每次用户输入两个以上的字母,我就会使用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;
}
我遇到的问题是-假设我输入两个字母,然后服务开始,该服务开始在国家/地区名称列表中进行搜索。 然后,我输入第三个字母,它再次点击服务,该服务再次在国家名称列表中搜索,而另一个正在进行中。 搜索不会同时运行。 首先搜索输入2个字母,然后搜索3个字母。
我需要的是-如果搜索已经在进行中,则停止该搜索,然后从一组新字母开始。 例如,如果搜索已经在进行2个字母的输入,则当用户输入第3个字母时,以2个字母停止上一个搜索,以3个字母开始。
我尝试过-当输入超过2个字母时先调用stopService(),然后再调用startService()。 但是它没有用。 我可以在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个字母的次数。
我要做的是使用AutoCompleteTextView,请查看下面的链接:
https://developer.android.com/reference/android/widget/AutoCompleteTextView.html
尽管您试图停止服务,但异步任务仍在线程上运行。 您需要确保还可以在服务的onStop()
方法中调用backgoundTask.cancel(true)
。
在开始新任务之前,请始终使用cancel()停止AsyncTask:
backgoundTask.cancel(true);
AsyncTask的文档在“取消任务”部分中提供了详细信息:
可以通过调用cancel(boolean)随时取消任务。 调用此方法将导致对isCancelled()的后续调用返回true。 调用此方法后,onCancelled(对象),而不是onPostExecute(对象)将doInBackground之后被调用(对象[])返回。 为了确保尽快取消任务,应始终从doInBackground(Object [])定期检查isCancelled()的返回值(如果可能)(例如在循环内)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.