繁体   English   中英

Android取消多次调用异步任务

[英]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(...);

创建从用户IDAsyncTask的映射:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM