如何停止后台/工作线程并重新开始?

时间:2017-11-29 08:57:49

标签: java android android-asynctask

我有一个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个字母。

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 []) ,如果可能的话   (例如在循环内部。)