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 线程。
我正在使用 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 线程。