[英]Android cancel async task called multi times
我如何取消多次调用的异步任务,下面的代码将解释我的意思:
现在这是我的类,它扩展了asyncTask
private class sendMessage extends AsyncTask<Integer,Void,Long>{
public sendMessage() {
super();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Long aLong) {
super.onPostExecute(aLong);
}
@Override
protected void onCancelled(Long aLong) {
super.onCancelled(aLong);
//task canceled will delete it from sqlite
sqlite.deleteMessage(aLong);
}
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected Long doInBackground(Integer... integers) {
Long id sqlite.insertMessage("blabalbla");
}
}
现在在android中,我有一个用户的listView,每个用户项都有按钮发送。 当用户单击发送时,将其显示加载到listView项上,这意味着发送。
这将解释更多:
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
new sendMessage().excute(user_id);
//sendMessage_task = new sendMessage();
//sendMessage_task.excute(user_id);
}
});
现在,如果我对课程有兴趣,可以轻松取消此AsyncTask
sendMessage_task.cancel(true);
但是,如果用户单击listView中的“发送按钮”中的许多项怎么办,刷新将失败,因为它对一个对象的刷新;当我取消任务时,它将仅取消最后一个。
用户单击listView中的多个项目发送按钮
sendMessage_task = new sendMessage();
sendMessage_task.excute(user_id);
sendMessage_task = new sendMessage();
sendMessage_task.excute(user_id);
sendMessage_task = new sendMessage();
sendMessage_task.excute(user_id);
当我取消课程时,只会取消最后一个课程
我只是想在arrayList或其他地方保存对象的引用,但是我遇到活动轮换问题,将它们全部删除
您的取消方法应如下所示
private void cancel() {
if (sendMessage_task == null) {
return;
}
sendMessage_task.cancel(true);
sendMessage_task = null;
}
然后在每个“发送”事件上调用取消。
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
cancel();
sendMessage_task = new sendMessage();
sendMessage_task.excute(user_id);
}
});
AsyncTask
实例只能执行一次。
您可以使用一个参考
private AsyncTask<Integer, Void, Long> task = null;
并在取消上一个listener
后在您的listener
器中多次创建它
在您的听众中:
if (task != null) {
task.cancel(true);
}
task = new MyAsyncTask();
task.execute(...);
创建从用户ID到AsyncTask
的映射:
Map<Integer, AsyncTask> tasks = new HashMap<>(); // assuming user ID is Integer. Adjust if not.
当用户单击项目时,将用户ID和您创建的AsyncTask放在地图上: tasks.put(userId, theNewlyCreatedTask)
。
当用户单击cancel时 ,通过用户ID和cancel()
查找相应的任务,如下所示:
AsyncTask myTask = tasks.get(userId);
if (myTask != null) {
myTask.cancel();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.