Xamarin Android Javascript 和 C# 之间的双向通信

Xamarin Android two way communication between Javascript and C#

我正在使用 Xamarin Android 开发一个应用程序,它有一个显示网页的 WebView。我想在 Javascript 从 WebView 到 c# 之间实现双向通信。我可以使用此 link 从 Java 脚本调用 C#。但是我找不到将数据从 C# 发送回 Javascript 的方法。 有没有办法在这种方法中来回发送数据。我认为在 Java 脚本中编写回调会起作用,但如何从 C# 代码中触发它。

现在,我的问题是如何从 javascript 接口 class 调用 WebView。我有一个 Java 脚本界面 class 如前所述 https://developer.xamarin.com/recipes/android/controls/webview/call_csharp_from_javascript/ 命名空间扫描器Android { public class JS 接口:Java.Lang.Object { 语境语境; WebView webView;

    public JSInterface (Context context, WebView webView1)
    {
      this.context = context;
      this.webView = webView1;
    }

    [Export]
    [JavascriptInterface]
    public void ShowToast()
    {
      Toast.MakeText (context, "Hello from C#", ToastLength.Short).Show ();
      this.webView.LoadUrl ("javascript:callback('Hello from Android Native');");

    }   
  }
}

代码在 LoadUrl 行抛出异常。 java.lang.Throwable: 在线程 'Thread-891' 上调用了 WebView 方法。所有 WebView 方法都必须在同一个线程上调用。 (Expected Looper Looper (main, tid 1) {42ce58a0} called on null, FYI main Looper is Looper (main, tid 1) {42ce58a0})

现在我正在努力如何从这个 Java 脚本界面引用 WebView class

是的。这是可能的。如果您的目标是 KitKat 或更高版本,您可以使用:

webView.EvaluateJavascript("enable();", null);

在这种情况下 enable(); 是一个 JS 函数。

如果您的目标是较低的 API 水平,您可以使用 LoadUrl();:

webView.LoadUrl("javascript:enable();");

编辑:

你在 LoadUrl 上抱怨的错误是因为它出于某种原因发生在非 UI 线程上。

因为您已经将 Context 传递到您的 JavascriptInterface class,那么您可以简单地将 ShowToast 的内容包装在:

context.RunOnUiThread(() => {
   // stuff here
});

只需将签名从 Context 更改为 Activity,它应该可以帮助您重新编组到 UI 线程。