之前做了一个demo,其中有一个按键响应是一个异步任务执行类,出现了一个这样的bug:在第一次调用的时候是可以执行的,但是第二次执行的时候异步任务类是不调用doInBackground方法的,而且不报错顺利执行。
遍历互联网各种资料,在doInBackground进行了这样的操作:
Thread thread = new Thread(){
public void run(){
// 此处写入耗时操作
}
};
thread.start();
将耗时操作加入到这个新的线程中去后,便可以连续多次调用异步任务的doinbackground方法。
至于为什么,这要深入研究一下异步任务的运行机
重复点击按键时,会执行一个AsyncTask,在doIngBackground()中,去打开socket连接,完成相应的校验。如果多次点击
但通过debug发现,后面的AsyncTask并没有真正执行。原因是因为前面的Task阻塞在了校验上。
通过查阅Android文档得知,AsyncTask,是异步处理类。它会新生成一个线程去执行doInBackground。对外,开发者不能获取此线程的引用,就算获取到了,对于像socket连接或IO操作会导致阻塞的作业,强行interrupt线程并不能退出阻塞。
所以为避免之后生成的AsyncTask能够被正常执行,请记住:
不要阻塞doInBackground(),我们应该新建一个线程来完成可能导致阻塞的操作。
但是有一个问题,在调用start方法之后我并没有调用join方法,其中具体机制还需下一步研究