之前做了一个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方法,其中具体机制还需下一步研究

 

 

 

posted on 2014-04-03 16:14  老梁  阅读(1090)  评论(0编辑  收藏  举报