从Xamarin中的C#对象调用JavaScript

从Xamarin中的C#对象调用JavaScript,javascript,c#,android,xamarin,Javascript,C#,Android,Xamarin,我已经能够从MainActivity中的C#调用JavaScript,但我正在尝试从一个对象调用JavaScript。我的大部分应用程序都在WebView中运行,我的JavaScript调用一个异步函数调用我的C#接口,当它完成时,我想调用我的JavaScript,但无法这样做。以下是我当前的设置: 在myMainActivity中,我将WebView设置为: browser = FindViewById<WebView>(Resource.Id.mainView); browser

我已经能够从
MainActivity
中的C#调用JavaScript,但我正在尝试从一个对象调用JavaScript。我的大部分应用程序都在WebView中运行,我的JavaScript调用一个异步函数调用我的C#接口,当它完成时,我想调用我的JavaScript,但无法这样做。以下是我当前的设置: 在my
MainActivity
中,我将WebView设置为:

browser = FindViewById<WebView>(Resource.Id.mainView);
browser.SetInitialScale(1);
browser.SetWebChromeClient(new GeoWebChromeClient());
browser.Settings.UseWideViewPort = true;
browser.Settings.LoadWithOverviewMode = true;
if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
{
    WebView.SetWebContentsDebuggingEnabled(true);
}
browser.Settings.SetGeolocationEnabled(true);
browser.Settings.JavaScriptEnabled = true;
browser.AddJavascriptInterface(new JSCSMedium(this, ref browser), "Android");
browser.LoadUrl("file:///android_asset/web/index.html");

但是
浏览器
无法在
jscsmedia
中访问。我尝试将
浏览器
对象作为引用传递,但通常情况下,它会抛出一个异常,指出
EvaluateJavascript
函数必须在实例化它的同一线程上调用。我还尝试将我的
MainActivity
的引用发送到
JSCSMedium
,并调用
MainActivity
中的一个函数来运行
EvaluateJavascript
,但它似乎没有任何作用。没有错误,没有崩溃,什么都没有。

问题在于
任务。Run
强制代码在线程池中运行,
浏览器。EvaluateJavascript
需要在主线程上运行

根据您的需要,这里至少有两个选项:

1) 在
任务内运行EvaluateJavascript调用。使用以下命令运行
块:

var h = new Handler(Looper.MainLooper);
h.Post(() => browser.EvaluateJavascript("javascript: alert('fooBar');", null));
2) 在
任务外部运行EvaluateJavascript调用。运行
块:

[Export]
[JavascriptInterface]
public async void SyncApps()
{
    await Task.Run(() => {

    //...

    });

    browser.EvaluateJavascript("javascript: alert('fooBar');", null);
}

不确定是否可以更改
SyncApps()
的返回类型。如果JS没有抱怨,你最好也改变一下。

我认为第一种选择是我最好的选择。有机会的时候我会玩的。谢谢。如果我实施了你的第一个选择,那就什么也做不了。没有错误,也不会打电话。我试着将我的
WebView
切换到一个参考,但没有用。如果我将其放置在
任务之外。运行
而不更改我对
SyncApps()
的声明,它会立即调用,但不会在任务完成后立即调用。运行。如果我更改编码以匹配您的第二个选择,它将崩溃并出现“未处理的异常”。很有趣。关于未处理的异常,您还可以添加其他内容吗?有什么问题吗?我仍然习惯于错误处理。不知何故,将整个函数转换为
async
已经把我的
BitmapDrawable
无法启动的应用程序的类型转换搞砸了。我把它移到了
LaunchIntent
的检查中,它工作得非常好。不知道这是怎么影响的。我必须把它们结合起来。我重写了异步函数以匹配您的,但是如果我将
EvaluateJavascript
移到块外,它会在
任务完成之前调用它。运行
块。不过,重写的异步函数的
Task.Run
块中的处理程序工作起来很有魅力。
var h = new Handler(Looper.MainLooper);
h.Post(() => browser.EvaluateJavascript("javascript: alert('fooBar');", null));
[Export]
[JavascriptInterface]
public async void SyncApps()
{
    await Task.Run(() => {

    //...

    });

    browser.EvaluateJavascript("javascript: alert('fooBar');", null);
}