日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android webview 加载本地,webview加载本地资源的各种尝试

發布時間:2024/7/23 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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加载本地资源的各种尝试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。