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