我是靠谱客的博主 爱撒娇向日葵,最近开发中收集的这篇文章主要介绍android webview 线程,关于WebView的使用-线程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

WebView问题系列:

1.问题场景:

JavaScript调用Android native方法finish掉当前界面,JavaScript调用代码为:

setTimeout(

function(){

Android.close();

},50);

Android 代码为(部分):

WebSettings webSettings = webview.getSettings();

webSettings.setJavaScriptEnabled(true);

webview.addJavascriptInterface(new WebAppInterface(), "Android");

private final class WebAppInterface {

// JavaScript调用此方法关闭页面

@JavascriptInterface

public void close() {

finish();

}

}

然而,并没有达到预期效果,抛出了以下异常:

exception--->java.lang.Throwable: A WebView method was called on thread 'JavaBridge'.

All WebView methods must be called on the same thread.

(Expected Looper Looper (main, tid 2) {fe6c9a9} called on Looper (JavaBridge, tid 884) {f5c0c14},

FYI main Looper is Looper (main, tid 2) {fe6c9a9})

2.先说解决办法,直接将finish()用runOnUIThread()包裹起来或者用view.post(runnable),将finish包裹在runnable里面就行了,效果也有了,异常也不报了

疑问:那是不是所有供JavaScript调用的native方法,都需要这样包裹起来呢?异常抛出来的根本原因是什么呢?

开始没有注意业务代码,后来定位代码才发现以下内容,当前Activity复写了finish方法,而复写的里面触发了UIThread的检查才导致的以上报错

@Override

public void finish() {

JRPCTTTaskManager.getInstance().releaseTask();

Intent intent = getIntent();

intent.putExtra(INTENT_EXTRA_JRPC_NEXT_URL, ui_webview.getUrl());

setResult(RESULT_OK, intent);

super.finish();

}

**************WebView************

@ViewDebug.ExportedProperty(category = "webview")

public String getUrl() {

checkThread();//就是这里检查线程时抛出了异常

return mProvider.getUrl();

}

3.问题解答

1.区分业务场景,setResult

2.将finish方法用UIThread包裹

既然至此,就看下android源码怎么说的吧,大写的尴尬。。。

0645d1981ca7?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

WebView addJavascriptInterface方法介绍

其中框中明确说了,js和java对象在webview的后台、私有线程交互的,所以要注意线程安全

最后

以上就是爱撒娇向日葵为你收集整理的android webview 线程,关于WebView的使用-线程的全部内容,希望文章能够帮你解决android webview 线程,关于WebView的使用-线程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部