Android ListView适配器项Asynktask停止问题
我有listview和自定义listadapter的活动。启动异步任务请求的列表的每个项目。现在,当我单击Back时,它将完成活动,但asynctask尚未完成。如何完成这项任务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) { ....
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");
}