Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

求WebView对象复用池代码 #51

Closed
free46000 opened this issue Aug 18, 2017 · 10 comments
Closed

求WebView对象复用池代码 #51

free46000 opened this issue Aug 18, 2017 · 10 comments

Comments

@free46000
Copy link

hi
我在你们微信公众号中看到了你们终端优化部分的WebView对象复用池的思路,求详细实现代码

腾讯开源公众号分享链接

@vasdeveloper
Copy link
Collaborator

webview复用池不在sonic项目中,webview复用的难点在于context的设置,其他的没有太特殊的逻辑。

@snailycy
Copy link

受腾讯的文档启发,试着实现了WebView池:
https://github.com/snailycy/AndroidHybridLib/blob/master/hybridlib/src/main/java/com/github/snailycy/hybridlib/webview/WebViewPool.java

@zhangyunhua
Copy link

我使用webview复用池,初次用没问题。 但是当复用时,点击back键,webview.canGoBack() 居然为true,当执行webview.goback()时会返回到我第一使用时的webview页面。

但是在回收时已经执行了 stopLoading(); clearCache(true); clearHistory(); 这些清空操作。

现在卡在这里了,不知道该如何解决了

@free46000
Copy link
Author

webview.clearHistory() 会保留当前页的,所以这块需要自己处理一下,判断如果是最后的页面让canGoBack返回false

@vasdeveloper
Copy link
Collaborator

@free46000 @zhangyunhua
由于WebView中loadUrl、stopLoading等接口调用在内核基本都是异步执行,可能存在任务在消息池子里面还没有执行到,建议的方式是:
1.销毁前先调用loadUrl("about:blank"),然后延迟1s后调用clearHistory,使用前再调用一次clearHistory;
2.如果还担心存在风险,参照free的方式进行canGoBack判断。

@free46000
Copy link
Author

@vasdeveloper @zhangyunhua
补充下,调用完loadUrl("about:blank"),可以在WebViewClient#doUpdateVisitedHistory中执行clearHistory操作,这样能保证当前WebView历史中只有about:blank

@ian-cuc
Copy link

ian-cuc commented Nov 16, 2017

现在的有一个问题,就是我就算执行了 loadUrl("about:blank") ,有时候打开新的页面复用的时候,会短暂的显示上一个页面的内容,这个有什么好的方法吗

@free46000
Copy link
Author

@ian-cuc 你说的上一个页面指的是 about:blank 页,还是about:blank页之前的页面

  • about:blank页是一个空白页,可以忽略此问题吧,(也可以加载一个透明的html页)
  • 如果是about:blank页之前的页面,那肯定是没有 load 成功,可以看看代码逻辑

@yunnywu
Copy link

yunnywu commented Dec 27, 2017

我最后的做法 判断goback 加个判断,防止后退到之前的页面
if(!mWebView.getUrl().equals(url)) {
mWebView.goBack();
return true;
}

同时在reset 的时候执行
webView.loadUrl("about:blank");
Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@OverRide
public void run() {
webView.clearHistory();
}
}, 500);

试了很多次 没出现问题了

@zengcanxiang
Copy link

@snailycy @zhangyunhua 在webview的复用池使用context更换的方案,你们有兼容zoom放大缩小崩溃的问题么? 当没有使用复用的时候,直接使用Activity初始化对象就不崩溃. 否则就会崩溃

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants