在做新闻类应用的时候有一个这样的需求,要在读取一条新闻的时候,要缓存接下来的三条内容,当这个时候断网了, 这四条新闻要求都是可以离线阅读的。
虽然最后做出来了,但总觉得方法太笨重,不知道还有没有更好的方法,希望有更好方法的各位大神们,走过路过给个思路~十分感谢。
先说说我这个笨重的解决思路吧。
受先看看xml文件布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="?attr/containerBackground">
<include
android:id="@+id/title_bar"
layout="@layout/detail_title_bar" />
<View
android:id="@+id/title_bar_divider"
android:layout_width="fill_parent"
android:layout_height="0.5dip"
android:layout_below="@id/title_bar"
android:background="@color/detail_divider_day" />
<FrameLayout
android:id="@+id/tool_bar_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
<include
android:id="@+id/tool_bar"
layout="@layout/tool_bar" />
</FrameLayout>
<WebView
android:id="@+id/wb_details"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/tool_bar_layout"
android:layout_below="@id/title_bar_divider"
android:visibility="gone"
android:layerType="software"
/>
<WebView
android:id="@+id/wb_details_gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/tool_bar_layout"
android:layout_below="@id/title_bar_divider"
android:visibility="gone"
/>
<WebView
android:id="@+id/wb_details_gone2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/tool_bar_layout"
android:layout_below="@id/title_bar_divider"
android:visibility="gone"
/>
<WebView
android:id="@+id/wb_details_gone3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/tool_bar_layout"
android:layout_below="@id/title_bar_divider"
android:visibility="gone"
/>
<ProgressBar
android:id="@+id/ss_htmlprogessbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="@dimen/pad_height_8"
android:layout_above="@id/tool_bar_layout"
android:layout_marginBottom="@dimen/pad_height_2"
android:layout_marginLeft="@dimen/pad_height_10"
android:layout_marginRight="@dimen/pad_height_10"
android:max="100"
android:visibility="gone" />
<RelativeLayout
android:id="@+id/notify_view"
android:layout_width="fill_parent"
android:layout_height="@dimen/pad_height_25"
android:layout_below="@id/title_bar"
android:layout_marginLeft="@dimen/pad_height_6"
android:layout_marginRight="@dimen/pad_height_6"
android:layout_marginTop="@dimen/pad_height_6"
android:background="@drawable/bg_notify"
android:visibility="gone" >
<TextView
android:id="@+id/notify_view_text"
style="@style/list_notify_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@null" />
<LinearLayout
android:id="@+id/notify_view_cancel_layout"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:orientation="horizontal" >
<View
android:id="@+id/notify_view_divider"
style="@style/notify_view_divider"
android:layout_width="0.5dip"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:layout_marginBottom="@dimen/pad_height_5"
android:layout_marginTop="@dimen/pad_height_5" />
<TextView
android:id="@+id/notify_view_cancel"
style="@style/list_notify_cancel_btn"
android:layout_width="wrap_content"
android:layout_height="fill_parent" />
</LinearLayout>
</RelativeLayout>
<View
android:id="@+id/drawer_shadow"
android:layout_width="fill_parent"
android:layout_height="@dimen/title_bar_height"
android:background="?attr/detailHColor"
android:visibility="invisible" />
<FrameLayout
android:id="@+id/customview_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/title_bar"
android:background="?attr/detailFColor"
android:clickable="true"
android:visibility="gone" />
</RelativeLayout>
布局中直接隐藏放置了四个webview,第一个webview在点击的时候会处于打开状态,其他三个处于隐藏状态。
在代码中也创建四个webview,将四个webview的配置都写出来。
@SuppressLint("SetJavaScriptEnabled")
@android.webkit.JavascriptInterface
private void initWebView() {
webView = (WebView) findViewById(R.id.wb_details);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);// 设置可以运行JS脚本
settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
settings.setSupportZoom(false);// 用于设置webview放大
settings.setBuiltInZoomControls(false);
CommonUtils.initWebData(this, settings);
webView.addJavascriptInterface(new JsInteration(), "control");
webView.setBackgroundColor(0);
webView.addJavascriptInterface(new JsInteration(), "jsObj");
webView.addJavascriptInterface(new JsInteration(), "jsinterface");
settings.setAppCacheMaxSize(1024 * 1024 * 20);// 设置缓冲大小,我设的是8M
String appCacheDir = this.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();
settings.setAppCachePath(appCacheDir);
settings.setAllowFileAccess(true);
settings.setAppCacheEnabled(true); // 设置缓存模式是否打开
if (!NetUtils.isConnected(DetailsActivity.this)) {
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
} else {
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
}
webView.setWebChromeClient(new ProgressChromeClient());
webView.getSettings().setDomStorageEnabled(true);
webView.setWebViewClient(new MyWebViewClient());
new MyAsnycTask().execute(news_url);
}
@SuppressLint("SetJavaScriptEnabled")
@android.webkit.JavascriptInterface
private void initWebView_gone() {
webView_gone = (WebView) findViewById(R.id.wb_details_gone);
WebSettings settings_gone = webView_gone.getSettings();
settings_gone.setJavaScriptEnabled(true);// 设置可以运行JS脚本
settings_gone.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
settings_gone.setSupportZoom(false);// 用于设置webview放大
settings_gone.setBuiltInZoomControls(false);
settings_gone.setAppCacheMaxSize(1024 * 1024 * 20);// 设置缓冲大小,我设的是8M
String appCacheDir = this.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();
settings_gone.setAppCachePath(appCacheDir);
settings_gone.setAllowFileAccess(true);
settings_gone.setAppCacheEnabled(true); // 设置缓存模式是否打开
String url_get = webView_gone.getUrl();
if (!NetUtils.isConnected(DetailsActivity.this)) {
settings_gone.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView_gone.loadUrl(url_get);
} else {
settings_gone.setCacheMode(WebSettings.LOAD_DEFAULT);
}
CommonUtils.initWebData(this, settings_gone);
webView_gone.getSettings().setDomStorageEnabled(true);
webView_gone.setWebViewClient(new MyWebViewClient_());
webView_gone.loadUrl(news_postion_url);
}
@SuppressLint("SetJavaScriptEnabled")
@android.webkit.JavascriptInterface
private void initWebView_gone2() {
webView_gone2 = (WebView) findViewById(R.id.wb_details_gone2);
WebSettings settings_gone = webView_gone.getSettings();
settings_gone.setJavaScriptEnabled(true);// 设置可以运行JS脚本
settings_gone.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
settings_gone.setSupportZoom(false);// 用于设置webview放大
settings_gone.setBuiltInZoomControls(false);
settings_gone.setAppCacheMaxSize(1024 * 1024 * 20);// 设置缓冲大小,我设的是8M
String appCacheDir = this.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();
settings_gone.setAppCachePath(appCacheDir);
settings_gone.setAllowFileAccess(true);
settings_gone.setAppCacheEnabled(true); // 设置缓存模式是否打开
String url_get = webView_gone2.getUrl();
if (!NetUtils.isConnected(DetailsActivity.this)) {
settings_gone.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView_gone2.loadUrl(url_get);
} else {
settings_gone.setCacheMode(WebSettings.LOAD_DEFAULT);
}
CommonUtils.initWebData(this, settings_gone);
webView_gone2.getSettings().setDomStorageEnabled(true);
webView_gone2.setWebViewClient(new MyWebViewClient_());
webView_gone2.loadUrl(news_postion1_url);
}
@SuppressLint("SetJavaScriptEnabled")
@android.webkit.JavascriptInterface
private void initWebView_gone3() {
webView_gone3 = (WebView) findViewById(R.id.wb_details_gone3);
WebSettings settings_gone = webView_gone3.getSettings();
settings_gone.setJavaScriptEnabled(true);// 设置可以运行JS脚本
settings_gone.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
settings_gone.setSupportZoom(false);// 用于设置webview放大
settings_gone.setBuiltInZoomControls(false);
settings_gone.setAppCacheMaxSize(1024 * 1024 * 20);// 设置缓冲大小,我设的是8M
String appCacheDir = this.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();
settings_gone.setAppCachePath(appCacheDir);
settings_gone.setAllowFileAccess(true);
settings_gone.setAppCacheEnabled(true); // 设置缓存模式是否打开
String url_get = webView_gone3.getUrl();
if (!NetUtils.isConnected(DetailsActivity.this)) {
settings_gone.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView_gone3.loadUrl(url_get);
} else {
settings_gone.setCacheMode(WebSettings.LOAD_DEFAULT);
}
CommonUtils.initWebData(this, settings_gone);
webView_gone3.getSettings().setDomStorageEnabled(true);
webView_gone3.setWebViewClient(new MyWebViewClient_());
webView_gone3.loadUrl(news_postion2_url);
}
这样的结果就达到了需求的要求。
但如果像之前,我只是写了两个webview,在第二个webview中直接
@SuppressLint("SetJavaScriptEnabled")
@android.webkit.JavascriptInterface
private void initWebView_gone() {
webView_gone = (WebView) findViewById(R.id.wb_details_gone);
WebSettings settings_gone = webView_gone.getSettings();
settings_gone.setJavaScriptEnabled(true);// 设置可以运行JS脚本
settings_gone.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
settings_gone.setSupportZoom(false);// 用于设置webview放大
settings_gone.setBuiltInZoomControls(false);
settings_gone.setAppCacheMaxSize(1024 * 1024 * 20);// 设置缓冲大小,我设的是8M
String appCacheDir = this.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();
settings_gone.setAppCachePath(appCacheDir);
settings_gone.setAllowFileAccess(true);
settings_gone.setAppCacheEnabled(true); // 设置缓存模式是否打开
if (!NetUtils.isConnected(DetailsActivity.this)) {
settings_gone.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
} else {
settings_gone.setCacheMode(WebSettings.LOAD_DEFAULT);
}
CommonUtils.initWebData(this, settings_gone);
webView_gone.getSettings().setDomStorageEnabled(true);
webView_gone.setWebViewClient(new MyWebViewClient_());
webView_gone.loadUrl(news_postion_url);
webView_gone.loadUrl(news_postion1_url);
webView_gone.loadUrl(news_postion2_url);
}
这样的结果就是只能缓存第一条和第四条新闻,中间的两条是缓存不到的。
好了,各位路过的大神如果有更好的方法,请留言,虚心请教更好的方法。