android.view.ViewRoot $ CalledFromWrongThreadException

时间:2013-04-25 17:05:26

标签: android

HTML:

<a href="javascript:AndroidFunction.xxxx()">xxxx</a>

的活动:

public class MainActivity extends Activity
    {
    @Override
    protected void onCreate(Bundle savedInstanceState)
            {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        

        WebView webview = (WebView) findViewById(R.id.webview);
        final MyJavaScriptInterface myJavaScriptInterface = new MyJavaScriptInterface(this);
        webview.addJavascriptInterface(myJavaScriptInterface, "AndroidFunction");
        webview.getSettings().setJavaScriptEnabled(true); 
        webview.loadUrl("file:///android_asset/x1.html");        
    }

    public class MyJavaScriptInterface {
        Context mContext;

        MyJavaScriptInterface(Context c) {
            mContext = c;
        }

        public void xxxx()
        {
            setContentView(R.layout.x);              
        }
    }
}

我收到了这个错误:

未被捕获的处理程序:thread WebViewCoreThread exiting due to uncaught exception android.view.ViewRoot$CalledFromWrongThreadException

只有创建视图层次结构的原始线程才能触及其视图。

请帮帮我。

3 个答案:

答案 0 :(得分:0)

首先,您不应该从setContentView以外的任何地方呼叫onCreate。如果您想更改View,请在布局层次结构中开始新的Activity或添加/更新View

此外,这个CalledFromWrongThreadException表示您在UI线程上没有允许时编辑View,这是不允许的(原因我现在不会进入)。我建议您使用View.post(Runnable action)编辑UI线程上的View。我的answer to this question可以帮到你。

答案 1 :(得分:0)

public void xxxx() {
    runOnUiThread(new Runnable() {
        public void run() {
           setContentView(R.layout.x);              
        }
    });
}

答案 2 :(得分:-1)

澳洲英语:        如果您尝试从UI线程外部向UI线程发送UI事件,则此错误很常见。        测试方法Thread尝试与UI线程外的UI进行交互。

建议:        使用Handler解决问题。

解决方案:Link