Is it possible to change the context of a WebView after it has been instantiated?

后端 未结 2 1292
予麋鹿
予麋鹿 2021-01-04 14:12

I have a WebView I\'m loading in an activity in order to have it preloaded so that it pops up immediately in a different Activity (launched from th

相关标签:
2条回答
  • 2021-01-04 14:53

    You can try to create the WebView with a MutableContextWrapper:

    MutableContextWrapper mMutableContext=new MutableContextWrapper(context);
    WebView mWebView=new WebView(mMutableContext);
    

    and later on you could do

    mMutableContext.setBaseContext(newcontext);
    

    But ...

    • WebView is a very complex component that will probably be using the passed context to create other objects like Handlers. WebView probably uses those handlers to post stuff to the original UI thread, so at the end you'll probably have a View with a mix of contexts, you know, a double memory leak (if it ever works properly)

    • Webview spans at least 1 thread "webcore" that is where the action happens and is also in constant communication with the original UI thread with ... handlers? through the original context? who knows!

    • There are even 2 different webview engines: Kitkat is chromium-based while jelly bean and previous versions use AOSP/WebView. So you have an additional breaking point.

    • The reasons you state are not strong enough imho. WebView is not that slow. If the app you load is, try to optimize it. There are a lot of things you can do for that, like loading the HTML & graphics from internal assets.

    0 讨论(0)
  • 2021-01-04 14:59

    In my App (it's browser) I have the same problem. I don't like to load WebView every time when user back to App. And I've solved this problem partially. I've overridden onBackPressed() on my HomeActivity and use moveTaskToBack(true) instead of super.onBackPressed(). So when user use system back on HomeActivity it does't destroy Activity and all views. It just minimize the App. Visually it's the same behavior but if user try to run App by launch icon, all views already loaded. I know it's temporary solution and all views can be destroyed by system any time but it gives quite good result. And covers a lot of cases for me.

    0 讨论(0)
提交回复
热议问题