android webview 加载本地,webview加载本地资源的各种尝试
1.webview 打開sd卡上的靜態html文件 ,js文件既然放在assets文件夾下能找到,那能通過放在sd卡,能加載嗎?
答:事實證明,是沒有用的。
2.既然能拿到html的數據,那我們是不是重寫html的script的tag的src屬性呢,前綴由我們動態地添加,是不是可以做到呢?
答:設定html中的js的路徑為:這樣在Android中,可以取得這個 script標簽,然后修改src的值:
private String updateTags(String html) {
Document doc = Jsoup.parse(html, "UTF-8");
Elements eles = doc.getElementsByTag("script");
for (Element e : eles) {
e.attr("src","file:///android_asset"+e.attr("src"));
}
return doc.toString();
}
修改如上代碼: bundle.putString("html",html);-->bundle.putString("html",updateTags(html) );
親測,這個是可以用的。但是在加載html的時候,需要用data的方式的進行加載。這樣,我們在html中,然后拿到script標簽,修改src的值,各自拿到自己路徑的js文件,這樣就可以達到用網絡的html但是用本地的js進行加載了。但是很明顯這樣的話,如果我們有多個script標簽,有些需要增加前綴,有些不要,那這樣的話,就需要設定一定的匹配規則了。
3.我們能不能通過執行js腳本,達到將js文件注入到html文件當中去,然后再由瀏覽器進行解釋執行呢?
private void injectScriptFile(WebView view, String scriptFile) {
InputStream input;
try {
input = getAssets().open(scriptFile);
byte[] buffer = new byte[input.available()];
input.read(buffer);
input.close();
String js = new String(buffer);
view.loadUrl("javascript:" + js);
} catch (IOException e) {
e.printStackTrace();
}
}
});
if(mUrl.contains("isjs=1")) {
injectScriptFile(mWebview, "zepto_1.1.3.js");
}
mWebview.loadUrl(mUrl);
在加載url的html頁面之前,可以執行js的注入。
4.細看webview的api,我們會發現,Android系統有提供給我們對應的api進行資源攔截,
webView.setWebViewClient(new WebViewClient() {
/**
*
* @return 本地jquery
*/
private WebResourceResponse editResponse() {
try {
return new WebResourceResponse("application/x-javascript", "utf-8", getAssets().open("webview.js"));
} catch (IOException e) {
e.printStackTrace();
}
//需處理特殊情況
return null;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
Log.d(TAG, "shouldInterceptRequest: " + url);
if (Build.VERSION.SDK_INT < 21) {
return editResponse();
}
return super.shouldInterceptRequest(view, url);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= 21) {
String url = request.getUrl().toString();
if (!TextUtils.isEmpty(url)) {
return editResponse();
}
}
return super.shouldInterceptRequest(view, request);
}
});
這種能對資源文件進行本地的替換,以節省需要下載的流量,提升webview瀏覽的性能,這種方案對圖片的替換也能很好的處理。
總結:基于上面第四種方案,我們就可以制定下發策略,本地更新策略,緩存策略,將資源存放本地,達到webview加載資源(圖片,js,css等)可以先從本地獲取,沒有再從網絡獲取,并緩存到本地,提高在app中瀏覽網頁的速度和用戶體驗。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的android webview 加载本地,webview加载本地资源的各种尝试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java窗口只能点一个_java – 为
- 下一篇: 8位可控加减法电路设计_高级工程师:相同