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");
}
}
查看取消任务部分了解更多信息。
我有 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");
}
}
查看取消任务部分了解更多信息。