黑马程序----关于异步与读取本地文件

本文探讨了在App中优化网络资源加载效率的方法,通过本地缓存策略减少网络请求,提高用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在做一个app的时候出现了一个问题,数据是从网络服务端读取的,可是app每次

启动的时候都从网络获取资源的话会消耗大量的资源,也显得程序不是那么的和谐。上网查了查这方面的

资料,能想对应的东西不是很多,于是自己就写了个简单的程序,也没进行优化什么的。

 

1第一次进入程序的时候读取网络,把资源json写成txt文件保存在sd卡里面。【也有写成xml或者保存在sqlite数据库的】

 

2再次读取的时候先判断本地的 txt文件是否存在,

 

3要是本地的txt文件存在,判断文件时候   “过期”  然后读取本地的txt文件然后 解析json展示数据

 

4.要是文件不存在或者文件过期的话,则读取网路数据,然后保存txt文件。

// 读取txt文件的函数
	private String loadTextFile(InputStream inputStream) throws IOException {
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		byte[] bytes = new byte[4096];
		int len = 0;
		while ((len = inputStream.read(bytes)) > 0) {
			byteArrayOutputStream.write(bytes, 0, len);
		}
		return new String(byteArrayOutputStream.toByteArray(), "UTF8");
	}

	//
	public String readFileSdcard(String fileName) {
		String res = "";
		try {
			FileInputStream fin = new FileInputStream(fileName);
			int length = fin.available();
			byte[] buffer = new byte[length];
			fin.read(buffer);
			res = EncodingUtils.getString(buffer, "UTF-8");
			fin.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
	}

	//
	public static String readFile(String fileName) throws IOException {

		File file = new File(fileName);
		ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024);
		FileInputStream inputStream = new FileInputStream(file);
		int len = 0;
		byte[] buffer = new byte[1024];
		while ((len = inputStream.read(buffer)) != -1) {
			outputStream.write(buffer, 0, len);
		}
		outputStream.close();
		inputStream.close();
		byte[] data = outputStream.toByteArray();
		return new String(data);
	}
public static final int CONFIG_CACHE_SHORT_TIMEOUT = 1000 * 60 * 30; // 30
																			// 分钟

	// 验证缓存是否过期的函数
	public boolean IsoutTime(String filename) {
		File files = new File("mnt/sdcard/" + filename);
		// if (files.exists() && files.isFile()) {
		long expiredTime = System.currentTimeMillis() - files.lastModified();
		if (expiredTime > CONFIG_CACHE_SHORT_TIMEOUT) {
			return true; // 过期了。
		} else {
			return false;// 没过期。
		}
	}



下面是异步。

private class TextAsyncTask extends AsyncTask<String, Integer, Void> {
		/*
		 * TextAsyncTask(String params) {
		 * 
		 * }
		 */
		@Override
		protected void onPreExecute() {
		}

		@Override
		protected Void doInBackground(String... params) {

			newslist1 = new ArrayList<NewsEntity>();
			newslist1 = getText(params[0], newslist1);
			newsList = newslist1;
			return null;
		}

		@Override
		protected void onPostExecute(Void result) {
			switch (getNewsReturnValue) {
			case 1:
				Toast.makeText(MainTow.this, "1", Toast.LENGTH_LONG).show();
				getNewsReturnValue = 0;
				break;
			case 2:
				Toast.makeText(MainTow.this, "2", Toast.LENGTH_LONG).show();
				getNewsReturnValue = 0;
				break;
			case 3:
				Toast.makeText(MainTow.this, "3", Toast.LENGTH_LONG).show();
				getNewsReturnValue = 0;
				break;

			case 4:
				Toast.makeText(MainTow.this, "4", Toast.LENGTH_LONG).show();
				getNewsReturnValue = 0;
				break;
			default:
				getNewsReturnValue = 0;
				break;
			}
			bb.notifyDataSetChanged();

		}

	}
//读取json数据解析成模具类
 
private ArrayList<NewsEntity> getText(String filename,
			ArrayList<NewsEntity> newslist1) {

		String requestResult = " ";

		requestResult = readFileSdcard("mnt/sdcard/" + filename + ".txt");
		if (requestResult == null) {
			Toast.makeText(getApplicationContext(), "读取失败", 1).show();
		}
		if (requestResult.equals("RESPONSEERROR")) {
			getNewsReturnValue = 3;
		} else if (!requestResult.equals("RESPONSENULL")) {
			newslist1 = HttpOperation.getObjectFromWebService(requestResult,
					newslist1);
			int newNum = newslist1.size();
			if (newslist1.isEmpty()) {

				getNewsReturnValue = 1;
			}
		} else {
			getNewsReturnValue = 4;
		}

		return newslist1;
	}


------- android培训java培训IOS培训.Net培训期待与您交流! ----------
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值