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

Use*_*382 5 xamarin.android xamarin

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

现在,我的问题是如何从javascript接口类调用WebView.我有一个Javascript接口类,如https://developer.xamarin.com/recipes/android/controls/webview/call_csharp_from_javascript/ namespace ScannerAndroid {public class JSInterface:Java.Lang.Object {Context context; 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');");

    }   
  }
}
Run Code Online (Sandbox Code Playgroud)

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

现在我正在努力如何从这个Java脚本接口类引用WebView

Che*_*ron 2

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

webView.EvaluateJavascript("enable();", null);
Run Code Online (Sandbox Code Playgroud)

本例中enable();是一个 JS 函数。

如果您的目标是较低的 API 级别,您可以使用LoadUrl();

webView.LoadUrl("javascript:enable();");
Run Code Online (Sandbox Code Playgroud)

编辑:

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

由于您已经将 传递到ContextJavascriptInterface 类中,因此您可以简单地将 的内容包装ShowToast在:

context.RunOnUiThread(() => {
   // stuff here
});
Run Code Online (Sandbox Code Playgroud)

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