如何取消多次调用的异步任务,以下代码将解释我的意思:
现在这是我的类,它扩展了asyncTask
output$thePlot <-renderPlot({
plotValue<-subset(letaLista, letaLista$Factor==input$Factor &
letaLista$Variabel== input$Variabel & letaLista$rest_alla==input$DataSource)
plotList[as.integer(plotValue[1,4])]
})
output$theTable <-renderTable({
plotValue<-subset(letaLista, letaLista$Factor==input$Factor &
letaLista$Variabel== input$Variabel & letaLista$rest_alla==input$DataSource)
skriva <- tableList[as.integer(plotValue[4])]
print(skriva)
})
现在在android中我有一个用户列表视图,每个用户项都有按钮发送。 当用户点击发送其显示加载时,listView项目意味着发送。
这将解释更多:
[(your uialertaction object) setValue:@0 forKey:@"titleTextAlignment"]
如果我对类
有参考,现在很容易取消这个AsyncTaskprivate 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");
}
}
但是,如果用户点击listView&#34;发送按钮&#34;参考会失败,因为它对一个对象的反对,当我取消任务时,它将仅取消最后一个。
用户点击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);
}
});
当我取消课程时,它将仅取消最后一个
我只是考虑在arrayList或其他地方保存对象的引用 但我有活动轮换问题将删除所有
答案 0 :(得分:0)
您的取消方法应该是
private void cancel() {
if (sendMessage_task == null) {
return;
}
sendMessage_task.cancel(true);
sendMessage_task = null;
}
然后在每个&#34;发送&#34;事件
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);
}
});
答案 1 :(得分:0)
AsyncTask
个实例只能执行一次。
您可以使用一个参考
private AsyncTask<Integer, Void, Long> task = null;
并在取消之前的listener
后多次重新创建
在你的听众中:
if (task != null) {
task.cancel(true);
}
task = new MyAsyncTask();
task.execute(...);
答案 2 :(得分:0)
创建从用户ID 到AsyncTask
的映射:
Map<Integer, AsyncTask> tasks = new HashMap<>(); // assuming user ID is Integer. Adjust if not.
当用户点击某个项目时,将您创建的用户ID和AsyncTask放入地图:tasks.put(userId, theNewlyCreatedTask)
。
当用户点击取消时,按用户ID和cancel()
找到相应的任务,如下所示:
AsyncTask myTask = tasks.get(userId);
if (myTask != null) {
myTask.cancel();
}