AsyncTask的onPostExecute方法未被系统回调

来源:互联网 发布:剑灵捏脸数据导入图片 编辑:程序博客网 时间:2024/05/22 00:26
  我们的TV客户端里增加了登录功能,在实现过程中,使用了AsyncTask来处理异步登录。在测试过程中,机率性的出现登录时,界面一直停在登录中的状态。

  开始的时候以为是网络请求未设置请求的超时时间,但是设置了也不管用,依旧复现,让人非常头疼。

  后来经过多次排查,发现是AsyncTask的onPostExecute()方法未被系统回调,是android Framework的一个bug。

问题解决:


  查了好多资料,这个问题的出现跟AsyncTask初始化有关系,AsyncTask中有一个静态的Handler,如下代码:

 

  private static final InternalHandler sHandler = new InternalHandler();

  AsyncTask的实例本来是应该在UI Thread中初始化,但是很多情况下,我们可能在某个非UI线程中无意中初始化了Handler的构造函数。

  用砖家的话来说就是:你喝奶的姿势不对。
  所以为了确保 AsyncTask在UI线程中初始化,可以在app的application的oncreate方法中,加入以下代码:

  

try {  Class.forName("android.os.AsyncTask");} catch (Exception e) {  e.printStackTrace();}

   这个bug在目前最新的android版本中依然存在,不知道为神马……

  参考资料:

  http://stackoverflow.com/questions/4280330/onpostexecute-not-being-called-in-asynctask-handler-runtime-exception
  http://www.eoeandroid.com/forum.php?mod=viewthread&tid=205952


  原文链接:http://www.67tgb.com/?p=619

  转载注明:望月听涛

原创粉丝点击