Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android WebView優化

Android WebView優化

編輯:關於Android編程

 

WebView可以很好地幫助我們展示html頁面,但是webview使用不當的話還是可能產生一定問題的,下面就以下幾個方面說說我的優化技巧

 

1、展示webview的activity可以另開一個進程,這樣就能和我們app的主進程分開了,即使webview產生了oom崩潰等問題也不會影響到主程序,如何實現呢,其實很簡單,在androidmanifest.xml的activity標簽裡加上android:process="packagename.web"就可以了,代碼如下:

 

        
        

運行起來就會發現多了一個進程,哈哈

 

 

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();

}

 

}


 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved