簡體   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