6.请求网络步骤

操作步骤都是:加载本地数据——如果没有请求服务器——服务器请求完保存数据——本地数据有了或者保存完数据了去解析数据

FileUtils

public class FileUtils {	public static final String CACHE = "cache";	public static final String ICON = "icon";	public static final String ROOT = "GooglePlay";	/**	 * 获取图片的缓存的路径	 * 	 * @return	 */	public static File getIconDir() {		return getDir(ICON);	}	/**	 * 获取缓存路径	 * 	 * @return	 */	public static File getCacheDir() {		return getDir(CACHE);	}	public static File getDir(String cache) {		StringBuilder path = new StringBuilder();		if (isSDAvailable()) {			path.append(Environment.getExternalStorageDirectory()					.getAbsolutePath());			path.append(File.separator);// '/'			path.append(ROOT);// /mnt/sdcard/GooglePlay			path.append(File.separator);			path.append(cache);// /mnt/sdcard/GooglePlay/cache		} else {			File filesDir = UiUtils.getContext().getCacheDir(); // cache																// getFileDir																// file			path.append(filesDir.getAbsolutePath());// /data/data/com.itheima.googleplay/cache			path.append(File.separator);// /data/data/com.itheima.googleplay/cache/			path.append(cache);// /data/data/com.itheima.googleplay/cache/cache		}		File file = new File(path.toString());		if (!file.exists() || !file.isDirectory()) {			file.mkdirs();// 创建文件夹		}		return file;	}	private static boolean isSDAvailable() {		if (Environment.getExternalStorageState().equals(				Environment.MEDIA_MOUNTED)) {			return true;		} else {			return false;		}	}}

BaseProtocol (协议) 

public abstract class BaseProtocol<T> {	public T load(int index) {		// 加载本地数据		String json = loadLocal(index);		if (json == null) {			// 请求服务器			json = loadServer(index);			if (json != null) {				saveLocal(json, index);			}		}		if (json != null) {			return paserJson(json);		} else {			return null;		}	}	private String loadServer(int index) {		HttpResult httpResult = HttpHelper.get(HttpHelper.URL +getKey()//请求网络,写xutils也行				+ "?index=" + index); 		String json = httpResult.getString();		return json;	}	private void saveLocal(String json, int index) {				BufferedWriter bw = null;		try {			File dir=FileUtils.getCacheDir();			//在第一行写一个过期时间 			File file = new File(dir, getKey()+"_" + index); // /mnt/sdcard/googlePlay/cache/home_0			FileWriter fw = new FileWriter(file);			 bw = new BufferedWriter(fw);			bw.write(System.currentTimeMillis() + 1000 * 100 + "");//如果数字过期了重新请求网络			bw.newLine();// 换行			bw.write(json);// 把整个json文件保存起来			bw.flush();			bw.close();		} catch (Exception e) {			e.printStackTrace();		}finally{			IOUtils.closeQuietly(bw);//关流		}	}	private String loadLocal(int index) {		//  如果发现文件已经过期了 就不要再去复用缓存了		File dir=FileUtils.getCacheDir();// 获取缓存所在的文件夹		File file = new File(dir, getKey()+"_" + index); 		try {			FileReader fr=new FileReader(file);			BufferedReader br=new BufferedReader(fr);			long outOfDate = Long.parseLong(br.readLine());			if(System.currentTimeMillis()>outOfDate){				return null;			}else{				String str=null;				String sw=new StringWriter();				while((str=br.readLine())!=null){									sw.write(str);				}				return sw.toString();			}					} catch (Exception e) {			e.printStackTrace();			return null;		}	}	/**	 * 解析json	 * @param json	 * @return	 */	public abstract T paserJson(String json);	/**	 * 说明了关键字	 * @return	 */	public abstract String getKey();}

子类的请求网络只需要关心这俩个方法就行了

附件里有三个http请求访问的类,以后可以直接拿来用,比较方便

HttpHelper里是访问的主要代码

HttpRetry里是返回的结果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏分布式系统进阶

Librdkafka的基础数据结构 2 --- 定时器 原子操作与引用计数

引用了一个新的struct来将引用计数和调用信息结合起来, 使用链表来管理这个struct的对象. 每次对引用计数的操作都要操作这个链表.

951
来自专栏wannshan(javaer,RPC)

dubbo通信消息解析过程分析(1)

由于rpc底层涉及网络编程接口,线程模型,网络数据结构,服务协议,细到字节的处理。牵涉内容较多,今天就先从一个点说起。 说说,dubbo通过netty框架做传...

5026
来自专栏美码师

补习系列-springboot 参数校验详解

在定义 Restful 风格的接口时,通常会采用 PathVariable 指定关键业务参数,如下:

7291
来自专栏后端沉思录

SPI概念及使用方法

SPI全称Service Provider Interfaces,用于发现接口的实现。在jdbc、日志、dubbo的设计中都使用SPI用于服务的发现。简单的以j...

2412
来自专栏ml

spring设置全局异常处理器

1.spring设置全局异常,它的原理是向上捕获 spring.xml配置 <!--自定义全局异常处理器--> <bean id="globalE...

40515
来自专栏小灰灰

java之的读取文件大全

java之的读取文件大全 使用java进行文件读写,因为使用的频率不高,加上写起来也没那么简单,经常容易忘记,然后就得去翻阅以前的笔记,或者找寻之前写的文件读...

58410
来自专栏Hongten

Lucene学习总结之三:Lucene的索引文件格式(1)

Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙。

1122
来自专栏分布式系统进阶

Kafka中Message存储相关类大揭密Kafka源码分析-汇总

1961
来自专栏浪淘沙

Spark工具包

962
来自专栏iOS122-移动混合开发研究院

【自问自答】关于 Swift 的几个疑问

感觉自己给自己释疑,也是一个极为有趣的过程。这次,我还新增了“猜想”一栏,来尝试回答一些暂时没有足够资料支撑的问题。 Swift 版本是:4.0.3。不同版本的...

3186

扫码关注云+社区

领取腾讯云代金券