【问题标题】:Android Javascript InterfaceAndroid Javascript 接口
【发布时间】:2013-11-06 17:24:45
【问题描述】:

我有一个带有 javascript 方法
的 webview 调用android Javascript 接口(JAVA) 方法,然后
JavaScript 接口(JAVA) 调用context(Reader) 活动的方法 来打开一个UI 屏幕。

当我直接从 ReaderActivity 运行 openDiscussionsUI() 时,它会很好地打开 UI,但从 Javascript 接口运行时却不能,它似乎没有完全通过 openDiscussionsUI() 方法运行,就好像它被中断了? 希望有人可以帮助我。提前致谢。



javascript方法

marginIconClick: function (itemId) {
    activity.startDiscussionsActivity();
}



(JAVA) JavaScript 接口方法

public void startDiscussionsActivity() {
    readerActivity.openDiscussionsUI();
    Log.e("startDiscussionsActivity","startDiscussionsActivity");
}



ReaderActivity 方法

public void openDiscussionsUI() {
    Log.e("openDiscussionsUI 1","openDiscussionsUI 1");
    discussionBox.startAnimation(slidenotesup);
    Log.e("openDiscussionsUI 2","openDiscussionsUI 2");
    discussionBox.setVisibility(View.VISIBLE);
    Log.e("openDiscussionsUI 3","openDiscussionsUI 3");
    discussionDescription.requestFocus();
    Log.e("openDiscussionsUI 4","openDiscussionsUI 4");
}



这是我的日志
点击图标编号#1

11-06 17:21:39.190  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 1﹕ openDiscussionsUI 1
11-06 17:21:39.190  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 2﹕ openDiscussionsUI 2


点击图标编号#2

11-06 17:22:32.154  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 1﹕ openDiscussionsUI 1
11-06 17:22:32.154  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 2﹕ openDiscussionsUI 2
11-06 17:22:32.154  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 3﹕ openDiscussionsUI 3
11-06 17:22:32.170  12951-12951/com.double_eye.monamiq I/WEBVIEW﹕ Message - 266:Uncaught Error: Error calling method on NPObject.


点击图标编号#3

11-06 17:22:52.818  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 1﹕ openDiscussionsUI 1
11-06 17:22:52.818  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 2﹕ openDiscussionsUI 2
11-06 17:22:52.818  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 3﹕ openDiscussionsUI 3
11-06 17:22:52.818  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 4﹕ openDiscussionsUI 4
11-06 17:22:52.818  12951-12980/com.double_eye.monamiq E/startDiscussionsActivity﹕ startDiscussionsActivity


点击图标编号#4

11-06 17:23:37.850  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 1﹕ openDiscussionsUI 1
11-06 17:23:37.850  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 2﹕ openDiscussionsUI 2
11-06 17:23:37.850  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 3﹕ openDiscussionsUI 3
11-06 17:23:37.850  12951-12980/com.double_eye.monamiq E/openDiscussionsUI 4﹕ openDiscussionsUI 4
11-06 17:23:37.850  12951-12980/com.double_eye.monamiq E/startDiscussionsActivity﹕ startDiscussionsActivity



第3次和第4次跑过去了还是不显示ui,很奇怪。

更新:

来自 Javascriptinterface 的回调未在 UI 线程上运行

公共无效测试(){ // 调用 AndroidInterface.test() 后 1ms 到达这里。到达网络线程。

public void startDiscussionsActivity() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                readerActivity.openDiscussionsUI();
                Log.e("startDiscussionsActivity","startDiscussionsActivity");
            }
        });
    }

【问题讨论】:

  • 确保您在主线程上运行 openDiscussionsUI()。我似乎记得 JavaScript 接口回调是在一个单独的线程上产生的,但是我现在无法验证它。
  • 非常感谢您的提醒,我会调查一下。
  • 看起来这是回调没有在ui线程上运行的问题,已经为awnser添加了修复,感谢帮助:D
  • 欢迎您。我已经发布了答案,如果您选择它,我将不胜感激。

标签: java javascript android


【解决方案1】:

确保所有 ui 工作都在主 (UI) 线程上执行。 JavaScript 接口回调一个单独的线程,这意味着您需要调用 myActivity.runOnUiThread() 或类似的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 2011-09-18
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多