get { return (Func<string, Task<string>>)GetValue(EvaluateJavascriptProperty); }
set { SetValue(EvaluateJavascriptProperty, value); }
}
internal class JavascriptResult : Java.Lang.Object, IValueCallback
{
private Action<string> _callback;
public JavascriptResult(Action<string> callback)
{
_callback = callback;
}
public void OnReceiveValue(Java.Lang.Object result)
{
_callback?.Invoke(Convert.ToString(result));
}
}
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
....
var webView = e.NewElement as NewWebView;
webView.EvaluateJavascript = async (js) =>
{
var reset = new ManualResetEvent(false);
var response = string.Empty;
Device.BeginInvokeOnMainThread(() =>
{
Control?.EvaluateJavascript(js, new JavascriptResult((r) =>
{
response = r;
reset.Set();
}));
});
await Task.Run(() => { reset.WaitOne(); });
return response;
}
.....
}
Все работает, но иногда приложение падает. Вот такая информация:
Fatal Exception: android.runtime.JavaProxyThrowable: System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Android.Webkit.WebView'.
at Java.Interop.JniPeerMembers.AssertSelf (Java.Interop.IJavaPeerable self) [0x00029] in <8b3b636835d84984ba4604c1f57b1983>:0
at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00000] in <8b3b636835d84984ba4604c1f57b1983>:0
at Android.Webkit.WebView.EvaluateJavascript (System.String script, Android.Webkit.IValueCallback resultCallback) [0x00050] in <84ca7e914f6148f0b961431a9ac4287b>:0
at Wrapping.Android.NewWebViewRenderer+<>c__DisplayClass7_0.<OnElementChanged>b__1 () [0x0003a] in <2ffd7f4aee294156b136af0874bc6181>:0
at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <84ca7e914f6148f0b961431a9ac4287b>:0
at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00008] in <84ca7e914f6148f0b961431a9ac4287b>:0
at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.71(intptr,intptr)
at mono.java.lang.RunnableImplementor.n_run(RunnableImplementor.java)
at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:30)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6196)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
Вероятно какой-то метод дёргается после закрытия страницы
Да, причём сложно отловить когда приложение "падает".
Ну отлавливай когда в OnElementChanged NewElement == null, отменяй подписки, сохраняй флаги и не выполняй действий с вьюхой после этого
"Падает" в основном потоке.
Понял, спасибо за наводку
Ну логично. Обращение к вьюхе идёт же
Обсуждают сегодня