2016-03-16 52 views
0

我有listview和自定義listadapter的活動。 List的EveryItem開始一個AsyncTask請求。現在,當我點擊onback完成活動,但asynctask沒有完成。如何完成這一切的AsyncTask?ListView Adapter item Asynktask Stop問題

public class MyListAdapter extends ArrayAdapter<String> 
{ 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    ...... 
    if(!status.get(position).isFetch) 
      { 
       statusList.get(position).FetchingData=true; 
       GetRequest request=new GetRequest(); 
       request.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, id); 
      } 
..... 
} 

class GetRequest extends AsyncTask<String, String, String> 
{......} 

} 

如果我在完成所有項目任務之前按下後退按鈕,然後完成其活動但不是任務。如何停止asynctask作爲活動結束..

+0

您可以取消onDestroy中的Asynctask。 –

+0

asynctask.cancel(true); –

+0

我建議你做這樣的事情http://stackoverflow.com/a/2740204/1564821 –

回答

0

您應該手動停止所有任務。活動生命週期不會自動處理您的任務。

你應該管理某處的所有任務(我建議Activity或Fragment,而不是ListView)。收集列表中的所有任務並停止onDestroy(或根據您的情況onPause)。

public MyActivity extends Activity { 
    private ArrayList<SomeTask> mTasks; 

    private void startTasks() { 
     SomeTask task = new SomeTask(); 
     task.execute(); 
     mTasks.add(task); 
    } 

    @Override void onDestroy() { 
     for (SomeTask task : mTasks) { 
      tasks.cancel(true); 
     } 
    } 

private class SomeTask extends AsyncTask<Void, Void, Void> { 

     private MyListItem mItem; 
     private int mIndex; 

     public SomeTask(MyListItem item, int index) { 
      mItem = item; 
      mIndex = index; 
     } 

     protected Long doInBackground(Void... urls) { 
      // do whatever you want 
      return null; 
     } 

     protected void onPostExecute(Void result) { 
      // update your adapter here 
     } 
    } 
} 

可悲的是,會的AsyncTask不能僅僅停留即使你打電話task.cancel(真)。 您還必須檢查任務是否在AsyncTask內被取消。 下面是AsyncTask reference page抽取的樣本:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
protected Long doInBackground(URL... urls) { 
    int count = urls.length; 
    long totalSize = 0; 
    for (int i = 0; i < count; i++) { 
     totalSize += Downloader.downloadFile(urls[i]); 
     publishProgress((int) ((i/(float) count) * 100)); 
     // Escape early if cancel() is called 
     if (isCancelled()) break; 
    } 
    return totalSize; 
} 

protected void onProgressUpdate(Integer... progress) { 
    setProgressPercent(progress[0]); 
} 

protected void onPostExecute(Long result) { 
    showDialog("Downloaded " + result + " bytes"); 
} 

}

結帳取消任務節以獲取更多信息。

+0

如何收集所有的任務,因爲所有的任務開始在arrayadapter並從活動取消它? –

+0

我編輯了更多描述性答案的答案。 –

+0

問題已解決,但並不完全。在適配器類中使用線程池執行器並行地開始10-12任務,將其存儲在arraylist中並在父活動中取消它。這裏出現了一些問題,下一個http請求會阻止一段時間.. –