我开发上以某种方式得到一个图书馆CalledFromWrongThread
上三星Galaxy S1异常崩溃(API V7 -的Android 2.1)。 该代码是这样的:
class MyWebViewClient extends WebViewClient {
@Override
public void shouldOverrideUrlLoading(WebView view, String url) {
someListener.addToUiView();
}
}
当然,实际被引发错误(它实现一个监听回调)的方法:
View v;
public void addToUiView(){
v.addView(new TextView(context)); //<-- this line is throwing the error on rare occasions
}
我跳过一些代码之间,但我没有做任何事情在其他地方很奇怪。 另外请注意:这只是崩溃似乎已经发生的时间非常非常小的%。 (不一定是决定性的,因为不是每个人都报告它们的数据)。
有其他人遇到此? 是WebCore的线程弄乱的东西了?
现在我还没有实际测试过这一点,但我要回答的我所知。 这就是说,我的直觉告诉我,你只是间歇性地看到了错误,因为从Web请求WebView
(浏览器)的发生是异步的不同程度,可能使用一个线程池来实现这一点。 基本上,有时请求资源并行,有时没有。 更糟糕的是,你可能只能在单个设备上,因为OEM厂商优化OS级代码(如会出现这个错误WebView
根据自己的喜好和意见(尤其是三星)内部)。 无论哪种方式,真正的问题是,你正在做的事情在肯定不能保证是“UI友好” ......也就是说,任何地方你得到一个子系统回调的地方“相关的UI”。
你的问题的解决方案比解释更简单:只需使用您的context
(即我假设是Activity
)..
Activity
■找一个内置调用的函数runOnUiThread(Runnable)
,将守卫可运行里面的代码错误的线程上运行。 基本上,你的问题是非常常见的和Android有一个内置的解决方案。 runOnUiThread
如果需要的话,只会增加开销,换句话说,如果你的线程是UI线程,它只是运行Runnable
,如果不是它使用正确的Handler
(与UI线程相关联的一个)来运行Runnable
。
下面是它应该是什么样子:
View v;
public void addToUiView() {
final Activity activity = (Activity) context;
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
v.addView(new TextView(activity));
}
});
}
我编码的最高权利的SO窗口内,所以我的道歉任何令人震惊的错误,我希望帮助,让我知道,如果你需要更多的信息或这不能解决您的问题-ck
文章来源: Android: CalledFromWrongThreadException from WebView's shouldOverrideUrlLoading