Android取消异步任务多次调用

时间:2018-02-09 12:41:56

标签: java android listview android-asynctask

如何取消多次调用的异步任务,以下代码将解释我的意思:

现在这是我的类,它扩展了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"]

如果我对类

有参考,现在很容易取消这个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");
    }
}

但是,如果用户点击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或其他地方保存对象的引用   但我有活动轮换问题将删除所有

3 个答案:

答案 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();
}