程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何从加载在 Xamarin.Android WebView 中的网页调用 c# 异步方法?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何从加载在 Xamarin.Android WebView 中的网页调用 c# 异步方法??

开发过程中遇到如何从加载在 Xamarin.Android WebView 中的网页调用 c# 异步方法?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何从加载在 Xamarin.Android WebView 中的网页调用 c# 异步方法?的解决方法建议,希望对你解决如何从加载在 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,Action2 日志,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;
    }
}

如何从加载在 Xamarin.Android WebView 中的网页调用 c# 异步方法?

我按照以下链接中的代码示例进行操作。 https://docs.microsoft.com/en-us/samples/xamarin/xamarin-forms-samples/customrenderers-hybridwebview/

大佬总结

以上是大佬教程为你收集整理的如何从加载在 Xamarin.Android WebView 中的网页调用 c# 异步方法?全部内容,希望文章能够帮你解决如何从加载在 Xamarin.Android WebView 中的网页调用 c# 异步方法?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:c#