1. 程式人生 > >黑馬程式----關於非同步與讀取本地檔案

黑馬程式----關於非同步與讀取本地檔案

今天在做一個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培訓期待與您交流! ----------