webview加載商城連接地址,系統webview的加載商城裏的一個分類頁面卡頓,其餘頁面正常。
自己寫webview顯然不現實,繼承系統的寫出來效果還是如此,然後就集成了騰訊X5的內核。
- TBS(騰訊瀏覽服務)的優勢
-
速度快:相比系統webview的網頁打開速度有30+%的提升;
-
省流量:使用雲端優化技術使流量節省20+%;
-
更安全:安全問題可以在24小時內修復;
-
更穩定:經過億級用戶的使用考驗,CRASH率低於0.15%;
-
兼容好:無系統內核的碎片化問題,更少的兼容性問題;
-
體驗優:支持夜間模式、適屏排版、字體設置等瀏覽增強功能;
-
功能全:在Html5、ES6上有更完整支持;
-
更強大:集成強大的視頻播放器,支持視頻格式遠多於系統webview;
-
視頻和文件格式的支持x5內核多於系統內核
-
防劫持是x5內核的一大亮點
下載X5的sdk,導入studio,application初始化x5內核
//蒐集本地tbs內核信息並上報服務器,服務器返回結果決定使用哪個內核。
private void initX5WebView() {
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
@Override
public void onViewInitFinished(boolean arg0) {
//x5內核初始化完成的回調,爲true表示x5內核加載成功,否則表示x5內核加載失敗,會自動切換到系統內核。
Log.d("app", " onViewInitFinished is " + arg0);
}
@Override
public void onCoreInitFinished() {
}
};
//x5內核初始化接口
QbSdk.initX5Environment(getApplicationContext(), cb);
}
將原來系統的webview換成騰訊x5的,(包名和佈局),儘可能將項目所有的webview都換了,官網有檢測器,可以下載一個檢測一遍,對着檢測結果一一更換;
mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);//開啓硬件加速
mWebView.loadUrl(SysParam.shoppingMall);
settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setLoadsImagesAutomatically(true);
settings.setDomStorageEnabled(true);
settings.setUseWideViewPort(true); //自適應屏幕
settings.setLoadWithOverviewMode(true);//自適應,alert文本問題
settings.setSupportMultipleWindows(true);
settings.setAllowFileAccess(true);//設置可以訪問文件
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebView.loadUrl(SysParam.shoppingMall); //默認加載的商城地址
x5和系統自帶webview方法差不讀,基本就換了個包名,商城裏需要更換頭像,webview裏封裝的方法直接供開發調用
private ValueCallback<Uri> mFilePathCallback4;
private ValueCallback<Uri[]> mFilePathCallback5;
webView.setWebChromeClient(new WebChromeClient(){
// 3.0
public void openFileChooser(ValueCallback valueCallback, String acceptType) {
mFilePathCallback4 = valueCallback;
openPhoto();//調用相冊方法
}
// 4.1
public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {
mFilePathCallback4 = valueCallback;
openPhoto();
}
// 5.0以上
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
mFilePathCallback5 = filePathCallback;
openPhoto();
return true;
}
}
openFileChooser方法需要自己寫,重寫現在不提示這個方法,只有5.0以上的onShowFileChooser提示
/**
* 訪問相冊,用的takephoto,需要的可以github集成一下,訪問相冊也可以自己寫
*/
private void openPhoto() {
takePhoto.onPickMultiple(1);
}
takephoot回調方法裏判斷版本號,將圖片返回給h5頁面
@Override
public void takeSuccess(TResult result) {
if (Build.VERSION.SDK_INT > 21) {
Bitmap bitmap = FileUtil.getimage(result.getImage().getPath());
Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, null, null));
mFilePathCallback5.onReceiveValue(new Uri[]{imageUri});
mFilePathCallback5 = null;
} else {
Bitmap bitmap = FileUtil.getimage(result.getImage().getPath());
Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, null, null));
mFilePathCallback4.onReceiveValue(imageUri);
mFilePathCallback4 = null;
}
}
跑起來確實流程,裏面頁面立馬不卡頓了,過兩天出現一個問題,第一次運行很順暢,退出app,殺掉後臺,在進入app加載商城,非常緩慢,卡的還不如系統的,很是蹊蹺,去官網文檔沒有一個辦法解決,就只能撐一次這肯定不行,沒辦法,逼得把X5的內核換成了walkview。
walkview依賴:
//project
allprojects {
repositories {
maven { url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2' }
jcenter()
google()
}
}
//module
implementation 'org.xwalk:xwalk_core_library:23.53.589.4'
walkview設置屬性具體和weview,x5的一樣,其餘的變了不少,例如監聽的:webviewclient換成了setResourceClient,webchromeclient換成了setUIClient;
mWebView.setResourceClient(new MyWebViewClient(mWebView));
mWebView.setUIClient(new XWalkUIClient(mWebView) {
//walkview選擇文件就一個方法
@Override
public void openFileChooser(XWalkView view, ValueCallback<Uri> uploadFile, String acceptType, String capture) {
mFilePathCallback4 = uploadFile;
openPhoto();
}
});
對應的takeSuccess回調就不用判斷了,只返回ValueCallback mFilePathCallback4即可,不用再返回數組
@Override
public void takeSuccess(TResult result) {
// if (Build.VERSION.SDK_INT > 21) {
// Bitmap bitmap = FileUtil.getimage(result.getImage().getPath());
// Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, null, null));
// mFilePathCallback5.onReceiveValue(new Uri[]{imageUri});
// mFilePathCallback5 = null;
// } else {
Bitmap bitmap = FileUtil.getimage(result.getImage().getPath());
Uri imageUri = Uri.parse(MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, null, null));
mFilePathCallback4.onReceiveValue(imageUri);
mFilePathCallback4 = null;
// }
}
walkview返回鍵
public void clickBack(int keycode, KeyEvent event) {
if (keycode == KeyEvent.KEYCODE_BACK && mWebView.getNavigationHistory().canGoBack()) {
//返回上一層
mWebView.getNavigationHistory().navigate(XWalkNavigationHistory.Direction.BACKWARD, 1);
}
}
一波三折的,爲了webview煞費苦心,回頭再看看x5,看能否找到解決辦法,再換回x5內核。本人還是感覺x5的好一些,順暢,體積不大,但項目問題只能割捨了,walkview也很好,但是體積大的離譜啊,打包出來體積打了20M,只再原來基礎上支持了’armeabi-v7a’的機型
ndk {
abiFilters 'armeabi','armeabi-v7a'
}
walkview精簡版體積少了一小半,主要不是太穩定,最後還是用的穩定版的。
文檔地址:crosswalk官網
記錄一下把,那天忘了再翻翻看!