Android 'CalledFromWrongThreadException' при вызове метода Android из JavaScript

1

У меня есть 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)

Это что-то делать с доступом к потоку пользовательского интерфейса из другого потока? Является ли метод Android (Java) из Javascript выполняемым при потоке не интерфейса?

И как сделать мой поток кода безопасным?

Теги:

1 ответ

8
Лучший ответ

Я не уверен, как вы вышли из потока пользовательского интерфейса, но чтобы вернуться, вы можете использовать post:

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

если вы находитесь внутри View. Если вы находитесь в Activity, измените post на runOnUiThread.

  • 0
    Спасибо, что работа,: D.
  • 0
    UPVOTE bigtime !!!! большое спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню