我们的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 版权协议,转载请附上原文出处链接和本声明。