ListView适配器项Asynktask停止问题

时间:2016-03-16 12:24:56

标签: android android-asynctask android-arrayadapter

我有listview和自定义listadapter的活动。 List的EveryItem启动AsyncTask请求。现在当我点击它返回它完成活动但是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>
{......}

}

如果我在完成所有项目任务之前按下后退按钮然后按其完成活动而不是任务。如何停止asynctask作为活动完成..

1 个答案:

答案 0 :(得分:0)

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

你应该在某个地方管理所有任务(我建议使用Activity或Fragment,而不是在ListView中)。收集列表中的所有任务并在onDestroy上停止运行(或根据您的情况暂停)。

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");
 }

}

结帐取消任务部分以获取更多信息。