繁体   English   中英

如何停止后台/工作线程并重新启动?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM