安卓:CalledFromWrongThreadException从的WebView shouldO

2019-09-29 14:33发布

我开发上以某种方式得到一个图书馆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的线程弄乱的东西了?

Answer 1:

现在我还没有实际测试过这一点,但我要回答的我所知。 这就是说,我的直觉告诉我,你只是间歇性地看到了错误,因为从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