用过webvIew开发的各位伙伴应该知道,同样的html代码在iOS手机上运行无压力,但是在Android手机上运行,慢的要死。还会有各种奇怪的蛋碎问题。后来查阅了很多文章,决定使用crosswalk替换webview。 具体crosswalk是什么大家百度吧,简单讲就是一个浏览器内核。比webview速度快,兼容性也好。
下面就是介绍下导入的方式。导入方式建议参考官方文档https://crosswalk-project.org/documentation/android.html 这里不再多说,这篇文章主要讲遇到的问题和解决方法。
这是中文版的导入方式https://software.intel.com/zh-cn/articles/v
需要说明的是,导入后会报错,开始我也不知道是什么原因,最后发现是android target版本太低,就是android sdk我用的是19后来把target换成22就没有问题了。就是android 5.1
另外一点,用webview的时候会用到setWebViewClient 方法 xwalkview 对应的方法 官方说是setResourceClient 但是我试了以下 个人感觉用setUIClient比较好。因为用webview的时候。我经常会用到 mWebView.setWebViewClient(new WebViewClient(){
public void onPageStarted(WebView view, String url, Bitmap favicon) {
customProgressDialog = CustomProgressDialog.createDialog(LogActivity.this);
customProgressDialog.show();
}
public void onPageFinished(WebView view, String url) {
customProgressDialog.dismiss();
}
});
在onLoadFinished和onLoadStarted中写一些方法和效果,但是用xwalkview是 同样想实现某些效果只能用
mXWalkView.setUIClient(new XWalkUIClient(mXWalkView){
public void onPageLoadStarted(XWalkView view,String url){
Log.i("mXWalkView onPageLoadStarted",url);
//加载中 请稍后
customProgressDialog = CustomProgressDialog.createDialog(LogActivity.this);
customProgressDialog.show();
}
public void onPageLoadStopped(XWalkView view,String url,XWalkUIClient.LoadStatus status){
Log.i("mXWalkView onPageLoadStopped",url);
customProgressDialog.dismiss();
if(url.equals("file:///android_asset/html/docs/login.html#")){
canGoBack = false;
Log.i("mXWalkView onPageLoadStarted","canGoBack"+canGoBack);
// mXWalkView.load("file:///android_asset/html/docs/login.html",null);
mXWalkView.getNavigationHistory().clear();
}
}
});
所以个人比较推荐用setUIClient方法 另外,用一个问题 至今没有解决
就是在使用xwalkview时, 无法禁用android的back键的解决办法:
返回键的up事件被xwalkview处理并被return true了;这样我的act就收不到也无法再处理此事件了。我的做法是写一个类派生自xwalkview,重写dispatchKeyEvent函数,判断是back键就直接return false;这样返回键的UP事件就会继续传递到activity,在我的act中再做逻辑处理。