Android開發 SharedPreferences讀取不到最新資料..

來源:互聯網
上載者:User

最近公司的APP要實現進入APP的時候使用者手動選擇地區,然後在登入,這個時候其實是選擇的對應的伺服器位址,然而在實現過程中,我發現SharedPreferences在首頁始終讀取不到最新的伺服器位址,然而登入頁面的伺服器位址又是最新更改的,比如說我剛開始進入的研發伺服器,後面切換為測試伺服器,然后里面的資料還是讀取的 研發伺服器的,後來列印發現首頁伺服器位址始終不是讀取的當前最新地址,最後看了下,APP的兩個service並沒有運行在同一進程,讀取不到資料,最後切換讀模數式為多進程模式,然後就讀取到了,

shared=getContext().getSharedPreferences("config",MODE_MULTI_PROCESS);

然而這樣是讀取到了最新的伺服器位址,後來又發現當切換為案頭,把APP掛在後台,在切回前台的時候,APP的伺服器位址又變回了之前的地址了,我想這個應該是要在儲存狀態的時候重新儲存到別的變數中去吧,切回來的時候再去讀取儲存的變數來實現伺服器位址的統一,後來乾脆換了一種方式實現儲存伺服器位址,使用Properties索引值對來儲存伺服器位址,這樣沒什麼問題

package com.shangyi.utils;import android.annotation.SuppressLint;import android.content.Context;import android.os.Environment;import android.os.StatFs;import android.text.TextUtils;import android.util.Log;import com.shangyi.log.SyLog;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.Map;import java.util.Properties;/** * 檔案操作工具類 * * @version 1.0 */public class FileUtils {    private static final String TAG = FileUtils.class.getSimpleName();    /**     * 寫入Properties資訊     *     * @param context  內容物件     * @param fileName 檔案名稱,不帶尾碼     * @param pKey     要儲存資料的key     * @param pValue   資料     * @throws IOException     */    public static void WriteProperties(Context context, String fileName, String pKey, String pValue) throws IOException {        //this.getFilesDir(); 這個是得到當前app目錄下的files目錄路徑        //this.getCacheDir(); 這個是得到當前app目錄下的cache目錄路徑        String filePath = context.getFilesDir() + "/" + fileName + ".properties";        File file = new File(filePath);        if (!file.exists()) {//檢查目錄檔案是否存在,不存在則建立            file.createNewFile();        }        Properties pps = new Properties();        InputStream in = new FileInputStream(filePath);        pps.load(in);//從輸入資料流中讀取屬性列表(鍵和元素對)        OutputStream out = new FileOutputStream(filePath);//調用 Hashtable 的方法 put。使用 getProperty 方法提供並行性。 //強制要求為屬性的鍵和值使用字串。傳回值是 Hashtable 調用 put 的結果。        pps.setProperty(pKey, pValue);        //以適合使用 load 方法載入到 Properties 表中的格式,        //將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出資料流        pps.store(out, "Update " + pKey + " name");    }    /**     * 根據Key讀取Value     *     * @param context     * @param fileName 檔案名稱,不包含尾碼     * @param key     * @return     */    public static String getValueByKey(Context context, String fileName, String key) {        String filePath = context.getFilesDir() + "/" + fileName + ".properties";        Properties pps = new Properties();        try {            InputStream in = new BufferedInputStream(new FileInputStream(filePath));            pps.load(in);            String value = pps.getProperty(key);            System.out.println("---------------------------------------------------------------------");            System.out.println(key + " = " + value);            System.out.println("---------------------------------------------------------------------");            return value;        } catch (IOException e) {            e.printStackTrace();            return null;        }    }    /**     * 讀取Properties的全部資訊     *     * @param context     * @param fileName     * @throws IOException     */    public static void getAllProperties(Context context, String fileName) throws IOException {        String filePath = context.getFilesDir() + "/" + fileName + ".properties";        Properties pps = new Properties();        InputStream in = new BufferedInputStream(new FileInputStream(filePath));        pps.load(in);        Enumeration en = pps.propertyNames(); //得到設定檔的名字        while (en.hasMoreElements()) {            String strKey = (String) en.nextElement();            String strValue = pps.getProperty(strKey);            System.out.println(strKey + "=" + strValue);        }    }    /**     * 刪除該目錄下的檔案     *     * @param path     */    public static void delFile(String path) {        if (!TextUtils.isEmpty(path)) {            File file = new File(path);            if (file.exists()) {                file.delete();            }        }    }    /**     * 根據檔案名稱清空所有資料     * @param context     * @param fileName     * @throws IOException     */    public static void clearAllProperties(Context context,String fileName) throws IOException{        String filePath = context.getFilesDir() + "/" + fileName + ".properties";        boolean d=deleteFileWithPath(filePath);       /* if(d){            ToastUtil.defaultToast(context.getApplicationContext(),"刪除成功");        }else {            ToastUtil.defaultToast(context.getApplicationContext(),"刪除失敗");        }*/       /* Properties pps = new Properties();        InputStream in = new BufferedInputStream(new FileInputStream(filePath));        pps.load(in);        pps.clear();//清楚所有資料*/    }    /**     * 寫文字檔 在Android系統中,檔案儲存在 /data/data/PACKAGE_NAME/files 目錄下     *     * @param context     * @param fileName     * @param content     */    public static void write(Context context, String fileName, String content) {        if (content == null)            content = "";        try {            //MODE_PRIVATE 預設模式,檔案只可以被調用該方法的應用程式訪問            //MODE_APPEND  如果檔案已存在就向該檔案的末尾繼續寫入資料,而不是覆蓋原來的資料。            //MODE_WORLD_READABLE 賦予所有的應用程式對該檔案讀的許可權。            //MODE_WORLD_WRITEABLE 賦予所有的應用程式對該檔案寫的許可權。            FileOutputStream fos = context.openFileOutput(fileName,                    Context.MODE_APPEND);            OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");            osw.write(content);            fos.flush();            osw.flush();            osw.close();            fos.close();            SyLog.d(TAG, "寫入成功");//            ToastUtil.defaultToast(context,"寫入成功");        } catch (Exception e) {            e.printStackTrace();            ToastUtil.defaultToast(context.getApplicationContext(), "寫入失敗");        }    }    /**     * @param context     * @param fileName     * @param id     */    public static void writeId(Context context, String fileName, String id) {        if (id == null)            id = "-1";        try {            Log.d("id",id);            //MODE_PRIVATE 預設模式,檔案只可以被調用該方法的應用程式訪問            //MODE_APPEND  如果檔案已存在就向該檔案的末尾繼續寫入資料,而不是覆蓋原來的資料。            //MODE_WORLD_READABLE 賦予所有的應用程式對該檔案讀的許可權。            //MODE_WORLD_WRITEABLE 賦予所有的應用程式對該檔案寫的許可權。            FileOutputStream fos = context.openFileOutput(fileName,                    Context.MODE_PRIVATE);            OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");            osw.write(id);            fos.flush();            osw.flush();            osw.close();            fos.close();            SyLog.d(TAG, "寫入成功");//            ToastUtil.defaultToast(context,"寫入成功");            Log.d("讀取id",read(context,fileName));        } catch (Exception e) {            e.printStackTrace();            ToastUtil.defaultToast(context.getApplicationContext(), "寫入失敗");        }    }    /**     * 讀取文字檔     *     * @param context     * @param fileName     * @return     */    public static String read(Context context, String fileName) {            try {                FileInputStream in = context.openFileInput(fileName);                InputStreamReader isr = new InputStreamReader(in);                char[] data = new char[in.available()];                isr.read(data);                String s = new String(data);                isr.close();                in.close();                SyLog.d(TAG, "讀取成功");//            ToastUtil.defaultToast(context,s);                return s;            } catch (Exception e) {                e.printStackTrace();//                ToastUtil.defaultToast(context.getApplicationContext(), "讀取使用者id失敗,請重新登入");            }        return "-1";    }    /**     * 讀取輸入資料流     *     * @param inStream     * @return     */    public static String readInStream(InputStream inStream) {        try {            ByteArrayOutputStream outStream = new ByteArrayOutputStream();            byte[] buffer = new byte[512];            int length = -1;            while ((length = inStream.read(buffer)) != -1) {                outStream.write(buffer, 0, length);            }            outStream.close();            inStream.close();            return outStream.toString();        } catch (IOException e) {            Log.i("FileTest", e.getMessage());        }        return null;    }    public static File createFile(String folderPath, String fileName) {        File destDir = new File(folderPath);        if (!destDir.exists()) {            destDir.mkdirs();        }        return new File(folderPath, fileName + fileName);    }    /**     * 向手機寫圖片     *     * @param buffer     * @param folder     * @param fileName     * @return     */    public static boolean writeFile(byte[] buffer, String folder,                                    String fileName) {        boolean writeSucc = false;        boolean sdCardExist = Environment.getExternalStorageState().equals(                android.os.Environment.MEDIA_MOUNTED);        String folderPath = "";        if (sdCardExist) {            folderPath = Environment.getExternalStorageDirectory()                    + File.separator + folder + File.separator;        } else {            writeSucc = false;        }        File fileDir = new File(folderPath);        if (!fileDir.exists()) {            fileDir.mkdirs();        }        File file = new File(folderPath + fileName);        FileOutputStream out = null;        try {            out = new FileOutputStream(file);            out.write(buffer);            writeSucc = true;        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                out.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return writeSucc;    }    /**     * 根據檔案絕對路徑擷取檔案名稱     *     * @param filePath     * @return     */    public static String getFileName(String filePath) {        if (StringUtils.isEmpty(filePath))            return "";        return filePath.substring(filePath.lastIndexOf(File.separator) + 1);    }    /**     * 根據檔案的絕對路徑擷取檔案名稱但不包含副檔名     *     * @param filePath     * @return     */    public static String getFileNameNoFormat(String filePath) {        if (StringUtils.isEmpty(filePath)) {            return "";        }        int point = filePath.lastIndexOf('.');        return filePath.substring(filePath.lastIndexOf(File.separator) + 1,                point);    }    /**     * 擷取副檔名     *     * @param fileName     * @return     */    public static String getFileFormat(String fileName) {        if (StringUtils.isEmpty(fileName))            return "";        int point = fileName.lastIndexOf('.');        return fileName.substring(point + 1);    }    /**     * 擷取檔案大小     *     * @param filePath     * @return     */    public static long getFileSize(String filePath) {        long size = 0;        File file = new File(filePath);        if (file != null && file.exists()) {            size = file.length();        }        return size;    }    /**     * 擷取檔案大小     *     * @param size 位元組     * @return     */    public static String getFileSize(long size) {        if (size <= 0)            return "0";        java.text.DecimalFormat df = new java.text.DecimalFormat("##.##");        float temp = (float) size / 1024;        if (temp >= 1024) {            return df.format(temp / 1024) + "M";        } else {            return df.format(temp) + "K";        }    }    /**     * 轉換檔大小     *     * @param fileS     * @return B/KB/MB/GB     */    public static String formatFileSize(long fileS) {        java.text.DecimalFormat df = new java.text.DecimalFormat("#.00");        String fileSizeString = "";        if (fileS < 1024) {            fileSizeString = df.format((double) fileS) + "B";        } else if (fileS < 1048576) {            fileSizeString = df.format((double) fileS / 1024) + "KB";        } else if (fileS < 1073741824) {            fileSizeString = df.format((double) fileS / 1048576) + "MB";        } else {            fileSizeString = df.format((double) fileS / 1073741824) + "G";        }        return fileSizeString;    }    /**     * 擷取目錄檔案大小     *     * @param dir     * @return     */    public static long getDirSize(File dir) {        if (dir == null) {            return 0;        }        if (!dir.isDirectory()) {            return 0;        }        long dirSize = 0;        File[] files = dir.listFiles();        for (File file : files) {            if (file.isFile()) {                dirSize += file.length();            } else if (file.isDirectory()) {                dirSize += file.length();                dirSize += getDirSize(file); // 遞迴調用繼續統計            }        }        return dirSize;    }    /**     * 擷取目錄檔案個數     *     * @param dir     * @return     */    public long getFileList(File dir) {        long count = 0;        File[] files = dir.listFiles();        count = files.length;        for (File file : files) {            if (file.isDirectory()) {                count = count + getFileList(file);// 遞迴                count--;            }        }        return count;    }    public static byte[] toBytes(InputStream in) throws IOException {        ByteArrayOutputStream out = new ByteArrayOutputStream();        int ch;        while ((ch = in.read()) != -1) {            out.write(ch);        }        byte buffer[] = out.toByteArray();        out.close();        return buffer;    }    /**     * 檢查檔案是否存在     *     * @param name     * @return     */    public static boolean checkFileExists(String name) {        boolean status;        if (!name.equals("")) {            File path = Environment.getExternalStorageDirectory();            File newPath = new File(path.toString() + name);            status = newPath.exists();        } else {            status = false;        }        return status;    }    /**     * 檢查路徑是否存在     *     * @param path     * @return     */    public static boolean checkFilePathExists(String path) {        return new File(path).exists();    }    /**     * 計算SD卡的剩餘空間     *     * @return 返回-1,說明沒有安裝sd卡     */    public static long getFreeDiskSpace() {        String status = Environment.getExternalStorageState();        long freeSpace = 0;        if (status.equals(Environment.MEDIA_MOUNTED)) {            try {                File path = Environment.getExternalStorageDirectory();                StatFs stat = new StatFs(path.getPath());                long blockSize = stat.getBlockSize();                long availableBlocks = stat.getAvailableBlocks();                freeSpace = availableBlocks * blockSize / 1024;            } catch (Exception e) {                e.printStackTrace();            }        } else {            return -1;        }        return (freeSpace);    }    /**     * 建立目錄     *     * @param directoryName     * @return     */    public static boolean createDirectory(String directoryName) {        boolean status;        if (null != directoryName && !directoryName.equals("")) {            File path = Environment.getExternalStorageDirectory();            File newPath = new File(path.toString() + directoryName);            status = newPath.mkdir();            status = true;        } else            status = false;        return status;    }    /**     * 檢查是否安裝SD卡     *     * @return     */    public static boolean checkSaveLocationExists() {        String sDCardStatus = Environment.getExternalStorageState();        boolean status;        
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.