首先说一下这个功能的功能点
第一点,像网易新闻一样,用户在登录和未登录情况下都可以离线下载新闻。
第二点,用户的离线下载最多固定10个频道,每个频道的第一页。
第三点,用户下载后的新闻在无网情况下可以直接查看。
这里初步完成以上三种功能,所用的方法和思路如下 :
一,从服务器的接口中获取json数据并解析
二,将解析出来的新闻的url串遍历通过io流存储到文件
三,用webview打开本地文件
思路和功能点清晰明了,下面看关键代码段,其中有些代码并不十分简洁,还有提升的空间,欢迎留言评论。
网络请求
case R.id.personal_download:
String url = "http://10.10.153.51/headline_hp/index.php?m=webapi&f=content&v=downNews";
HttpsDownLoad(url);
解析返回数据
private void HttpsDownLoad(final String serverURL) {
httpInstance = new HttpInstance();
new Thread(new Runnable() {
public void run() {
try {
String data = httpInstance.getInstance().doHttpGet(serverURL);
DownNonet downNonetbean = new Gson().fromJson(data, DownNonet.class);
if (downNonetbean.rt == 0) {
downDetails = downNonetbean.data;
handler.sendEmptyMessage(110);
} else if (downNonetbean.rt == 90001) {
handler.obtainMessage(Constants.SEND_AUTCH_ERROR).sendToTarget();
} else if (downNonetbean.rt == 91008) {
handler.obtainMessage(Constants.SEND_TICKET_ERROR).sendToTarget();
} else {
handler.obtainMessage(Constants.SEND_FAILD).sendToTarget();
}
} catch (Exception e) {
e.printStackTrace();
handler.sendEmptyMessage(111);
}
}
}).start();
}
采用耗时操作进行io流的读取
case 110:
if (downDetails != null) {
new Thread(new Runnable() {
public void run() {
for (DownDetail downDetail : downDetails) {
webviewdetail = downDetail.webview;
SPDataTools.spSavefownfile(getActivity(), downDetail.id, downDetail.cid, webviewdetail);
try {
Log.d("zhsy", "webviewdetail====" + webviewdetail);
FileUtiils.downFile(downDetail.cid + "downfile" + downDetail.id, webviewdetail, getActivity());
} catch (Exception e) {
e.printStackTrace();
Log.d("zhsy", "e==" + e);
}
}
}
}).start();
}
break;
读取文件的包装类
public static void downFile(String filename,String url,Context context) throws Exception{
//getFilesDir()获取你app的内部存储空间,相当于你的应用在内部存储上的根目录。
// File dest = new File(context.getFilesDir(),filename);
File dest = new File("/sdcard/data/"+filename+".html");
InputStream is;//接收字节输入流
FileOutputStream fos = new FileOutputStream(dest);//字节输出流
URL wangyi = new URL(url);
is = wangyi.openStream();
BufferedInputStream bis = new BufferedInputStream(is);//为字节输入流加缓冲
BufferedOutputStream bos = new BufferedOutputStream(fos);//为字节输出流加缓冲
int length;
byte[] bytes = new byte[1024*20];
while((length = bis.read(bytes, 0, bytes.length)) != -1){
fos.write(bytes, 0, length);
}
bos.close();
fos.close();
bis.close();
is.close();
}
无网络情况下用webview读取本地文件
if (!NetUtils.isConnected(this)) {
filename = newDetail.cid +"downfile"+ newDetail.id;
Log.v("zhsy", "newDetail.cid====="+newDetail.cid+"==newDetail.id=====" + newDetail.id+"==filename==="+filename);
webView.loadUrl("file:///sdcard/data/"+filename+".html");
}
好了,以上就是这个功能的基本功能和核心代码段,有什么问题可以留言交流哦~欢迎 阅读~