大佬教程收集整理的这篇文章主要介绍了如何从加载在 Xamarin.Android WebView 中的网页调用 c# 异步方法?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 Xamarin 和 Xamarin.Forms 构建适用于 iOS 和 AndroID 的应用程序。我按照 Customizing a WebView 文档制作了 HybrIDWebVIEw 控件并在不同平台项目上自定义呈现。
现在,问题出在 androID 项目中。我按照该文档创建了一个“JavaScriptWebVIEwClIEnt”和“JsBrIDge”类。在'JsBrIDge'类中,我定义了一些将导出到WebVIEw的方法。
例如
public class JsBrIDge : java.lang.object
{
Readonly WeakReference<HybrIDWebVIEWrenderer> hybrIDWebVIEWrenderer;
public JsBrIDge(HybrIDWebVIEWrenderer hybrIDRenderer)
{
hybrIDWebVIEWrenderer = new WeakReference<HybrIDWebVIEWrenderer>(hybrIDRenderer);
}
[JavaScripTinterface]
[Export("invokeAction")]
public voID InvokeAction(String data)
{
HybrIDWebVIEWrenderer hybrIDRenderer;
if (hybrIDWebVIEWrenderer != null && hybrIDWebVIEWrenderer.TryGetTarget(out hybrIDRenderer))
{
((HybrIDWebVIEw)hybrIDRenderer.Element).InvokeAction(data);
}
}
[JavaScripTinterface]
[Export("showDialog")]
public String ShowDialog(String data)
{
String ret = "Alert :" + datetiR_558_11845@e.Now;
return ret;
}
}
它与上面的代码运行良好。但在真实场景中,我需要从共享库中调用一些异步方法。然后,我更改了如下代码:
public class JsBrIDge : java.lang.object
{
Readonly WeakReference<HybrIDWebVIEWrenderer> hybrIDWebVIEWrenderer;
public JsBrIDge(HybrIDWebVIEWrenderer hybrIDRenderer)
{
hybrIDWebVIEWrenderer = new WeakReference<HybrIDWebVIEWrenderer>(hybrIDRenderer);
}
[JavaScripTinterface]
[Export("invokeAction")]
public voID InvokeAction(String data)
{
HybrIDWebVIEWrenderer hybrIDRenderer;
if (hybrIDWebVIEWrenderer != null && hybrIDWebVIEWrenderer.TryGetTarget(out hybrIDRenderer))
{
((HybrIDWebVIEw)hybrIDRenderer.Element).InvokeAction(data);
}
}
[JavaScripTinterface]
[Export("showDialog")]
public async Task<String> ShowDialog(String data)
{
String ret = "Alert :" + await GetDataAsync();
return ret;
}
}
这样,我什至无法成功构建项目。
Severity Code Description Project file line Suppression State Error Failed to generate Java type for class: Kp.DroID.JsBrIDge due to System.NullReferenceException: Object reference not set to an instance of an object. at Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Signature..ctor(String name,String signature,String connector,String managedParameters,String outerType,String superCall) in /Users/builder/azdo/_work/451/s/xamarin-androID/external/Java.Interop/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs:line 689 at Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.Signature..ctor(MethodDeFinition method,ExportAttribute export,TypeDeFinitionCache cachE) in /Users/builder/azdo/_work/451/s/xamarin-androID/external/Java.Interop/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs:line 658 at Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator.AddMethod(MethodDeFinition registeredMethod,MethodDeFinition implementedMethod) in /Users/builder/azdo/_work/451/s/xamarin-androID/external/Java.Interop/src/Java.Interop.Tools.JavaCallableWrappers/Java.Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs:line 385 at Java.Interop.Tools.JavaCallableWrappers.JavaCallableWrapperGenerator..ctor(TypeDeFinition type,Action
2 日志,TypeDeFinitionCache 缓存)在 /Users/builder/azdo/_work/451/s/xamarin-androID/external/Java.Interop/src/Java.Interop.Tools.JavaCallableWrappers/Java 中。 Interop.Tools.JavaCallableWrappers/JavaCallableWrapperGenerator.cs:line 140
在 Xamarin.AndroID.Tasks.GenerateJavastubs.CreateJavasources(IEnumerable1 javaTypes,TypeDeFinitionCache cachE) Kp.AndroID
你知道原因吗?我的问题是如何在 WebVIEw 中从网页调用异步 c# 方法?
1.创建 HybridWebView2 并创建 ShowDialog
方法。
public class HybridWebView2 : WebView
{
Action<String> action;
public static readonly BindableProperty UriProperty = BindableProperty.Create(
propertyName: "Uri",returnType: typeof(String),declaringType: typeof(HybridWebView2),DefaultValue: default(String));
public String Uri
{
get { return (String)GetValue(UriProperty); }
set { SETVALue(UriProperty,value); }
}
public void RegisterAction(Action<String> callBACk)
{
action = callBACk;
}
public void Cleanup()
{
action = null;
}
public void ShowDialog(String data)
{
if (action == null || data == null)
{
return;
}
action.Invoke(data);
}
}
2.使用 HybridWebView
<local:HybridWebView2 x:Name="hybridWebView2" Uri="index.html" />
3.注册要从 JavaScript 调用的 ShowDiaplg
操作
hybridWebView2.RegisterAction(data => DisplayAlert("Alert",datetiR_558_11845@e.Now + "/n" + data,"OK"));
4.在 Android 平台上创建自定义渲染器。
HybridWebViewRenderer2.cs:
[assembly: ExportRenderer(typeof(HybridWebView2),typeof(HybridWebViewRenderer2))]
namespace CustomRenderer.Droid
{
public class HybridWebViewRenderer2 : WebViewRenderer
{
const String JavascriptFunction = "function invokeCSharpAction(data){jsBridge2.showDialog(data);}";
Context _context;
public HybridWebViewRenderer2(Context context) : base(context)
{
_context = context;
}
protected override void OnElementChanged(ElementChangedEventArgs<WebView> E)
{
base.onElementChanged(E);
if (e.oldElement != null)
{
Control.RemoveJavascripTinterface("jsBridge");
((HybridWebView2)Element).Cleanup();
}
if (e.NewElement != null)
{
Control.SetWebViewClient(new JavascriptWebViewClient2(this,$"javascript: {JavascriptFunction}"));
Control.AddJavascripTinterface(new JSBridge2(this),"jsBridge2");
Control.LoadUrl($"file:///android_asset/Content/{((HybridWebView2)Element).Uri}");
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
((HybridWebView2)Element).Cleanup();
}
base.Dispose(disposing);
}
}
}
JavascriptWebViewClient2.cs:
public class JavascriptWebViewClient2 : FormsWebViewClient
{
String _javascript;
public JavascriptWebViewClient2(HybridWebViewRenderer2 renderer,String javascript) : base(renderer)
{
_javascript = javascript;
}
public override void OnPageFinished(WebView view,String url)
{
base.onPageFinished(view,url);
view.EvaluateJavascript(_javascript,null);
}
}
JSBridge2.cs:
public class JSBridge2 : Java.Lang.object
{
readonly WeakReference<HybridWebViewRenderer2> hybridWebViewRenderer;
public JSBridge2(HybridWebViewRenderer2 hybridRenderer)
{
hybridWebViewRenderer = new WeakReference<HybridWebViewRenderer2>(hybridRenderer);
}
[JavascripTinterface]
[Export("showDialog")]
public void ShowDialog(String data)
{
HybridWebViewRenderer2 hybridRenderer;
if (hybridWebViewRenderer != null && hybridWebViewRenderer.TryGetTarget(out hybridRenderer))
{
((HybridWebView2)hybridRenderer.Element).ShowDialog(data);
}
//String ret = "Alert :" + datetiR_558_11845@e.Now;
//return ret;
}
}
我按照以下链接中的代码示例进行操作。 https://docs.microsoft.com/en-us/samples/xamarin/xamarin-forms-samples/customrenderers-hybridwebview/
以上是大佬教程为你收集整理的如何从加载在 Xamarin.Android WebView 中的网页调用 c# 异步方法?全部内容,希望文章能够帮你解决如何从加载在 Xamarin.Android WebView 中的网页调用 c# 异步方法?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。