关于多个异步任务线程如何取消上一个线程的问题

app中遇到这个问题,当用户点击某个标签时,用异步任务开子线程向服务器请求数据并刷新显示。如图:

但难免有用户喜欢点着玩,而且使劲点,作为程序员,我们得宽容用户。所以,我们采用延迟发消息的机制,若用户点击的时间在上一个点击的延迟时间内,即上一个消息还未发出,又来一个发向handler的消息,我们就可以将上一个消息remove掉。

代码如下:

handler1.removeMessages(1000);

handler1.sendEmptyMessageDelayed(1000, 500);

发送消息后执行异步任务,这样还会出现上一个任务没执行完,又来一个新任务。很明显上一个任务无用了,需要取消(如果有的话)。

示例代码:

if (getCourseTask!= null && !getCourseTask.isCancelled()) {
// getCourseTask是异步任务

getCourseTask.cancel(true);

getCourseTask = null;

pullToRefreshView.onRefreshComplete();//属于界面的恢复工作。

}

时间: 2024-07-31 22:55:42

关于多个异步任务线程如何取消上一个线程的问题的相关文章

操作系统核心原理-4.线程原理(上)线程基础与线程同步

我们都知道,进程是运转中的程序,是为了在CPU上实现多道编程而发明的一个概念.但是进程在一个时间只能干一件事情,如果想要同时干两件或者多件事情,例如同时看两场电影,我们自然会想到传说中的分身术,就像孙悟空那样可以变出多个真身.虽然我们在现实中无法分身,但进程却可以办到,办法就是线程.线程就是我们为了让一个进程能够同时干多件事情而发明的“分身术”. 一.线程基础 1.1 线程概念 线程是进程的“分身”,是进程里的一个执行上下文或执行序列.of course,一个进程可以同时拥有多个执行序列.这就像

线程问题-一个线程怎么调用另一个线程的结果(2)

1 public class Job1{ 2 public static void main(String[] args){ 3 //ThreadClass t=new ThreadClass(); 4 //RunnableClass r=new RunnableClass(); 5 Sums s=new Sums(); 6 ThreadClass t1=new ThreadClass(s); 7 //Thread t1=new Thread(new ThreadClass(s)); 8 Thr

线程问题—一个线程怎么调出另外一个线程的结果。

问题:建两线程,线程1进行计算1*1+~+99*99,线程2打印出线程1名字,每隔段时间读取一次线程1的计算结果? 1 public class Other{ 2 public static volatile int sum; 3 public static void main(String[] args){ 4 Thread t1=new ThreadClass(); 5 t1.setName("我是线程1"); 6 Thread t2=new Thread(new Runnable

linux程序设计——取消一个线程(第十二章)

12.7    取消一个线程 有时,想让一个线程能够要求还有一个线程终止,就像给它发送一个信号一样. 线程有方法能够做到这一点,与与信号处理一样.线程能够被要求终止时改变其行为. pthread_cancel是用于请求一个线程终止的函数: #inlude <pthread.h> int pthread_cancel(pthread_t thread); 这个函数提供一个线程标识符就能够发送请求来取消它. 线程能够用pthread_setcancelstate设置线程的取消状态 #include

线程系列02,多个线程同时处理一个耗时较长的任务以节省时间

当面对一个耗时较长的任务时,我们可以把这个任务切分成多个部分,然后同时交给多个线程处理. □ 统计字节数组一个比较耗时的方式 以下来统计一个字节数组的大小. class Program { static byte[] values = new byte[500000000]; static void Main(string[] args) { GenerateByteArray(); Console.WriteLine("正在统计字节数"); Stopwatch watch = new

C#线程系列讲座(3):线程池和文件下载服务器

如果设计一个服务器程序,每当处理用户请求时,都开始一个线程,将会在一定程序上消耗服务器的资源.为此,一个最好的解决方法就是在服务器启动之前,事先创建一些线程对象,然后,当处理客户端请求时,就从这些建好的线程中获得线程对象,并处理请求.保存这些线程对象的结构就叫做线程池. 在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下,ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framework版本的不同,这些

【转】线程、Thread类和线程终止

一.线程Thread启动 0. Thread类实现了java.lang.Runnable接口,即实现了run方法.虽然在Sun JDK中,start()调用了start0()方法,start0()方法又是native的,但实际上新的线程就是调用了Thread的run()方法,当然这native的实现中一定有线程的fork操作,使两个线程并列执行. 1. Thread类有8个重载的构造方法.在Sun JDK的源码中,这8个构造方法都是调用了一个私有的init()方法来初始化对象的各个属性.这其中会

Android怎样保证一个线程最多仅仅能有一个Looper?

1. 怎样创建Looper? Looper的构造方法为private,所以不能直接使用其构造方法创建. private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); mThread = Thread.currentThread(); } 要想在当前线程创建Looper.需使用Looper的prepare方法,Looper.prepare(). 假设如今要我们来实现Looper.prepare()这种方法

线程池异常处理之重启线程处理任务

线程池异常处理之重启线程处理任务 本文记录一下在使用线程池过程中,如何处理 while(true)循环长期运行的任务,在业务处理逻辑中,如果抛出了运行时异常时怎样重新提交任务. 这种情形在Kafka消费者中遇到,当为每个Consumer开启一个线程时, 在线程的run方法中会有while(true)循环中消费Topic数据. 本文会借助Google Guava包中的com.google.common.util.concurrent.ThreadFactoryBuilder类创建线程工厂,因为它能