ListView Adapter 项目 Asynktask 停止问题

ListView Adapter item Asynktask Stop Issue

我有 activity 列表视图和自定义列表适配器。 EveryItem of List 启动 AsyncTask 请求。现在,当我单击 onback 时,它完成了 activity 但 asynctask 没有完成。如何完成这一切 AsyncTask ?

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>
{......}

}

如果我在完成所有项目任务之前按下后退按钮,那么它完成 activity 但不是任务。如何在 activity 完成时停止异步任务..

您应该手动停止所有任务。 Activity 生命周期不会自动处理您的任务。

您应该在某个地方管理所有任务(我建议 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
         }
     }
}

遗憾的是,即使您调用 task.cancel(true),AsyncTask 也不会停止。 您还必须检查任务是否在 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");
 }

}

查看取消任务部分了解更多信息。