Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView适配器项Asynktask停止问题_Android_Android Asynctask_Android Arrayadapter - Fatal编程技术网

Android ListView适配器项Asynktask停止问题

Android ListView适配器项Asynktask停止问题,android,android-asynctask,android-arrayadapter,Android,Android Asynctask,Android Arrayadapter,我有listview和自定义listadapter的活动。启动异步任务请求的列表的每个项目。现在,当我单击Back时,它将完成活动,但asynctask尚未完成。如何完成这项任务 public class MyListAdapter extends ArrayAdapter<String> { @Override public View getView(final int position, View convertView, ViewGroup parent) { ....

我有listview和自定义listadapter的活动。启动异步任务请求的列表的每个项目。现在,当我单击Back时,它将完成活动,但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>
{......}

}
公共类MyListAdapter扩展了ArrayAdapter
{
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
......
if(!status.get(position.isFetch)
{
statusList.get(position).FetchingData=true;
GetRequest=新的GetRequest();
request.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR,id);
}
.....
}
类GetRequest扩展了异步任务
{......}
}

如果我在完成所有项目任务之前按backbutton,则它将完成活动,而不是任务。如何在活动完成时停止异步任务。

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

您应该在某处管理所有任务(我建议使用活动或片段,而不是ListView)。收集列表中的所有任务,并在onDestroy(或根据您的情况暂停)上停止它们

public MyActivity扩展活动{
私有阵列列表MTASK;
私有无效startTasks(){
SomeTask任务=新建SomeTask();
task.execute();
mTasks.add(任务);
}
@重写void onDestroy(){
对于(SomeTask任务:mTasks){
任务。取消(true);
}
}
私有类SomeTask扩展了AsyncTask{
私人糜烂;
私人int mIndex;
公共任务(MyListItem项,int索引){
mItem=项目;
mIndex=指数;
}
受保护的长doInBackground(无效…URL){
//你想干什么就干什么
返回null;
}
受保护的void onPostExecute(void结果){
//在此处更新适配器
}
}
}
不幸的是,AsyncTask不会停止,即使您调用task.cancel(true)。 您还必须检查任务是否在异步任务中取消。 以下是一个样本,取自:

私有类下载文件任务扩展异步任务{
受保护的长doInBackground(URL…URL){
int count=url.length;
长totalSize=0;
for(int i=0;i
}


签出取消任务部分了解更多信息。

您可以在onDestroy.Asynctask.cancel(true)中取消Asynctask;我建议您这样做:如何在arrayadapter中启动所有任务时收集所有任务,并将其从活动中取消?问题已解决,但尚未完全解决。。在适配器类中使用线程池执行器并行启动10-12任务,将其存储在arraylist中,并在父活动中取消它。这里出了点问题,下一个http请求阻塞了一段时间。我想你应该把这个问题作为一个新问题发布(因为它显然与这个问题不同),但我还是会回答的。AsyncTask可以同时运行有限数量的任务,并且数量会因Android OS版本而异。如果这个或任何答案已经解决了你的问题,请考虑点击复选标记。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。
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
         }
     }
}
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");
 }