【发布时间】:2018-07-20 05:45:43
【问题描述】:
如何取消多次调用的异步任务,下面的代码将解释我的意思:
现在这是我的扩展 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.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“发送按钮”中的许多项目,则引用将失败,因为它对一个对象的引用,当我取消任务时,它只会取消最后一个。
用户点击列表视图中的多个发送按钮
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 或其他地方保存对象的引用 但我有活动轮换问题会将它们全部删除
【问题讨论】:
-
您想在何时何地取消任务非常模糊,但您自己说第一个问题是您没有存储对正在运行的任务的任何引用,因此没有什么可以取消的。解决这个问题,然后询问其余的问题。
-
@M.Prokhorov 取消将在再次单击发送按钮时执行 .. 是的,我不存储参考,因为它在 listView 中有许多项目,我将为其存储参考以及为什么我在那里发布问题,如果我完成了那个?
-
有几个项目的事实并不意味着你不应该存储任何东西。相反,您应该确定任务和列表项之间的关系,然后将该关系复制到存储中以运行任务。
标签: java android listview android-asynctask