1. 程式人生 > >新手--網路訪問的json資料儲存在本地資料夾, 離線使用

新手--網路訪問的json資料儲存在本地資料夾, 離線使用

這裡寫了一個Demo, 因為看之前的同事寫的程式碼, 在MainActivity中太多,因此抽出了一個專門處理下載的util

具體程式碼如下(因為我寫的很多變數需要在其他類中訪問,這裡直接使用 public static 來定義的,減少麻煩, 此外,因為我是用的是webservice來獲取伺服器資料,因此還刪除了我的一些其他的內容,免得程式碼看起來太雜,雖然只多了十幾行)

這裡因為刪除了一些內容,可能會有些錯誤導包之類的,大家可以按照自己的需要修改!  程式碼中的json資料並沒寫,需要自己下載才能正常執行顯示.

package com.ontime.netdemo.activity;
import 
org.ksoap2.SoapEnvelope;
import android.content.Context;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.widget.TextView;import com.google.gson.Gson;import com.ontime.netdemo.R;import com.ontime.netdemo.bean.JsonResult;import com.ontime.netdemo.utils.DownLoadUtil;import
com.ontime.netdemo.utils.MyApplication;public class MainActivity extends AppCompatActivity { public static TextView tv; @Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv
); DownLoadUtil.downloadFromNet(); //從網路上下載資料到本地,之後直接使用本地資料 tv.setText(DownLoadUtil.loadJsonDatafromLocal(MyApplication.getContext())); } }
package com.ontime.netdemo.utils;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import com.ontime.netdemo.activity.MainActivity;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class DownLoadUtil {
    public static String jsonData;  //從網路獲取到的json字串,這裡我就不寫獲取過程了
    private static BufferedWriter bw = null;
    private static BufferedReader br = null;
    private static File cacheFile;  //存在本地的資料夾

    //json資料儲存本地資料夾中
public static void storeJsonData(Context context, String jsonData) {
        try {
            cacheFile = new File(context.getFilesDir(), "jsonData");
            bw = new BufferedWriter(new FileWriter(cacheFile));
            bw.newLine();
            bw.write(jsonData);
            Log.e("storeJson", "儲存資料到本地資料夾中:" + cacheFile);
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            bw = null;
        }
    }

    //從本地載入資料
public static String loadJsonDatafromLocal(Context context) {
        cacheFile = new File(context.getFilesDir(), "jsonData");
        StringBuffer stringBuffer = new StringBuffer();
        if (cacheFile.exists()) {
            try {
                br = new BufferedReader(new FileReader(cacheFile));
                while (br.ready()) {
                    stringBuffer.append(br.readLine().trim().toString());
                }
                br.close();
                Log.d("loadJsonDatafromLocal", stringBuffer.toString());
                return stringBuffer.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            Toast.makeText(MyApplication.getContext(),"讀取的檔案不存在",Toast.LENGTH_SHORT).show();
        }
        return null;
    }



    public static void downloadFromNet() {
        new Thread(new Runnable() {
            @Override
public void run() {
                try {
                    //這裡是從網路獲取json資料的
                    //呼叫下載資料的方法,將json字串作為實參
DownLoadUtil.storeJsonData(MyApplication.getContext(), jsonData);
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.d("Exception", e.toString());
                }
            }
        }).start();
    }
}

xml檔案如下,為了簡單,demo中只寫了一個可以滑動的 textview, 將本地資料夾中的資料顯示

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ontime.netdemo.activity.MainActivity"
>

    <ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
>

        <TextView
android:id="@+id/tv"
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
    </ScrollView>
</RelativeLayout>