Android WebView优化
WebView可以很好地帮助我们展示html页面,但是webview使用不当的话还是可能产生一定问题的,下面就以下几个方面说说我的优化技巧
1、展示webview的activity可以另开一个进程,这样就能和我们app的主进程分开了,即使webview产生了oom崩溃等问题也不会影响到主程序,如何实现呢,其实很简单,在androidmanifest.xml的activity标签里加上android:process="packagename.web"就可以了,代码如下:
<activity android:name=".WebViewActivity" android:process="com.web" android:label="@string/app_name" > </activity>
运行起来就会发现多了一个进程,哈哈
2、webview的创建也是有技巧的,最好不要在layout.xml中使用webview,可以通过一个viewgroup容器,使用代码动态往容器里addview(webview),这样可以在onDestory()里销毁掉webview及时清理内存,另外需要注意创建webview需要使用applicationContext而不是activity的context,销毁时不再占有activity对象,这个大家应该都知道了,最后离开的时候需要及时销毁webview,onDestory()中应该先从viewgroup中remove掉webview,再调用webview.removeAllViews();webview.destory(); 代码如下:
创建:
ll = new LinearLayout(getApplicationContext()); ll.setOrientation(LinearLayout.VERTICAL); wv = new WebView(getApplicationContext());
销毁:
@Override protected void onDestroy() { ll.removeAllViews(); wv.stopLoading(); wv.removeAllViews(); wv.destroy(); wv = null; ll = null; super.onDestroy(); }
3、进一步的优化,activity被动被杀之后,最好能够保存webview状态,这样用户下次打开时就看到之前的状态了,嗯,就这么干,webview支持saveState(bundle)和restoreState(bundle)方法,所以就简单了,哈哈,看看代码吧:
保存状态:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); wv.saveState(outState); Log.e(TAG, "save state..."); }
是不是很熟悉啊,哈哈
恢复状态:
在activity的onCreate(bundle savedInstanceState)里,这么吊用:
if(null!=savedInstanceState){ wv.restoreState(savedInstanceState); Log.i(TAG, "restore state"); }else{ wv.loadUrl("http://3g.cn"); }
试用一下,结果还是令人满意的,恢复的相当到位啊!32个赞!!!
但是,我还是有一个疑问,朋友圈打开网页back之后再打开也能恢复到原来位置,不知道他们怎么做到的,正常back的话是不会调用onSaveInstanceState(bundle)的,我们正常就没法保存状态了,希望知道的朋友可以回复我一下,谢谢。
好了,先写这么多。
下面贴出完整的代码,希望对大家有个帮助。
package com.example.test;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
public class WebViewActivityextends Activity {
private staticfinal String TAG = WebViewActivity.class.getName();
WebView wv;
LinearLayout ll;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ll = new LinearLayout(getApplicationContext());
ll.setOrientation(LinearLayout.VERTICAL);
wv = new WebView(getApplicationContext());
WebSettings setting = wv.getSettings();
setting.setJavaScriptEnabled(true);
setting.setBuiltInZoomControls(true);
setting.setAppCacheEnabled(true);
setting.setDisplayZoomControls(true);
ll.addView(wv);
setContentView(ll);
if(null!=savedInstanceState){
wv.restoreState(savedInstanceState);
Log.i(TAG,"restore state");
}else{
wv.loadUrl("http://3g.cn");
}
wv.setWebViewClient(new WebViewClient(){
@Override
publicboolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d(TAG,"jump to :"+url);
wv.loadUrl(url);
returntrue;
}
@Override
publicvoid onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.d(TAG,"pageStarted:"+url);
}
@Override
publicvoid onPageFinished(WebView view, String url) {
//TODO Auto-generated method stub
super.onPageFinished(view, url);
Log.d(TAG,"pageFinished:"+url);
}
@Override
publicvoid onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
//TODO Auto-generated method stub
super.onReceivedError(view, errorCode, description, failingUrl);
Log.e(TAG,"onReceivedError code :"+errorCode+" , failingUrl:"+failingUrl);
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
wv.saveState(outState);
Log.e(TAG,"save state...");
}
@Override
public void onBackPressed() {
if(wv.canGoBack())
wv.goBack();
else{
super.onBackPressed();
// Process.killProcess(Process.myPid());
}
}
@Override
protected void onDestroy() {
ll.removeAllViews();
wv.stopLoading();
wv.removeAllViews();
wv.destroy();
wv = null;
ll = null;
super.onDestroy();
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。