新闻的离线下载功能仿网易之(一) 基本功能实现

首先说一下这个功能的功能点

第一点,像网易新闻一样,用户在登录和未登录情况下都可以离线下载新闻。

第二点,用户的离线下载最多固定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");
}


好了,以上就是这个功能的基本功能和核心代码段,有什么问题可以留言交流哦~欢迎 阅读~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值