从 Javascript 调用 Android 方法时的 Android 'CalledFromWrongThreadException'

标签 android

我有 webview,我在 android 中使用地理位置功能。 我正在使用 javascript (onload) 调用 Android 方法

public void getLocation() {
   _context.getLocation();
}

当位置收到这个执行

public void locationUpdated(Location location) {
        NumberFormat frm = NumberFormat.getNumberInstance(new Locale("en_US"));
        // call javascript function
        webView.loadUrl("javascript:locationChangedHandler(" + frm.format (location.getLatitude()) + "," + frm.format(location.getLongitude()) + ")");
}

有时我得到这个异常,这个异常

04-04 01:17:06.262: ERROR/AndroidRuntime(659): FATAL EXCEPTION: Timer-1
        android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
        at android.view.ViewRoot.invalidateChild(ViewRoot.java:607)
        at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633)
        at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505)
        at android.view.View.invalidate(View.java:5139)
        at android.view.View.onFocusChanged(View.java:2664)
        at android.widget.TextView.onFocusChanged(TextView.java:6469)
        at android.widget.AutoCompleteTextView.onFocusChanged(AutoCompleteTextView.java:1048)
        at android.webkit.WebTextView.onFocusChanged(WebTextView.java:357)
        at android.view.View.clearFocusForRemoval(View.java:2577)
        at android.view.ViewGroup.removeViewInternal(ViewGroup.java:2188)
        at android.view.ViewGroup.removeViewInternal(ViewGroup.java:2181)
        at android.view.ViewGroup.removeView(ViewGroup.java:2129)
        at android.webkit.WebTextView.remove(WebTextView.java:583)
        at android.webkit.WebView.clearTextEntry(WebView.java:1830)
        at android.webkit.WebView.loadUrl(WebView.java:1542)
        at android.webkit.WebView.loadUrl(WebView.java:1553)
        at com.binus.MainView$1.gotLocation(MainView.java:33)
        at com.binus.GeoLocation$GetLastLocation.run(GeoLocation.java:88)
        at java.util.Timer$TimerImpl.run(Timer.java:289)

这与从其他线程访问 UI 线程有关吗? 从 Javascript 调用 Android (Java) 方法是否在非 UI 线程上执行?

以及如何使我的代码线程安全?

最佳答案

我不确定您是如何离开 UI 线程的,但是要重新开始,您可以使用 post:

public void locationUpdated(final Location location) {
    post(new Runnable() {
        @Override
        public void run() {
            webView.loadUrl(...);
        }
    });
}

如果您在 View 中。如果您在 Activity 中,则将 post 更改为 runOnUiThread

关于从 Javascript 调用 Android 方法时的 Android 'CalledFromWrongThreadException',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5533723/

相关文章:

android - Android上如何通过拖动查看大图?就像我们在 Google map 上所做的一样

java - 解析 URL 以获取 hyber 链接并将 hyber 链接存储在单独的变量中

java - libsuperuser 实时获取命令输出

android - 如何在 Android 中将 double 转换为 int?

android - 适用于Android的开源Google Analytics(分析)库

android - Kotlin 数组中的所有项始终包含最后一项

android - 为 Phonegap/Titanium 跨平台开发选择硬件

java - 为什么Android应用程序不需要main方法

java - ConnectivityManager.TYPE_WIMAX 是什么连接类型?

javascript - 用钛金属打造三 Angular 形视觉效果