AsyncTask的onPostExecute方法未被系统回调

  • Post author:
  • Post category:其他


我们的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

转载注明:

望月听涛



版权声明:本文为wangyuetingtao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。