myq_26 2013-03-13 09:27 采纳率: 16.7%
浏览 3477
已采纳

从 Javascript 中调用 Android 方法

我在 android 的 webview 中使用 geo-location 特征。使用 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()) + ")");
}

获得以下的异常:

03-10 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线程?使用非UI线程上执行的 javascript (onload) 来调用Android方法吗?

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

  • 写回答

3条回答

  • Baby_Bonnie 2013-03-18 10:01
    关注

    如果是在一个 View 中使用 post:

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

    如果是在一个 Activity 中,把 post 换成 runOnUiThread。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图