<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                #### 2.4.2 使用文件共享 **共享文件也是一種不錯的進程間通信方式,兩個進程通過讀/寫同一個文件來交換數據,比如A進程把數據寫入文件,B進程通過讀取這個文件來獲取數據**。 我們知道,在Windows上,一個文件如果被加了排斥鎖將會導致其他線程無法對其進行訪問,包括讀和寫,而**由于Android系統基于Linux,使得其并發讀/寫文件可以沒有限制地進行,甚至兩個線程同時對同一個文件進行寫操作都是允許的,盡管這可能出問題。通過文件交換數據很好使用,除了可以交換一些文本信息外,我們還可以序列化一個對象到文件系統中的同時從另一個進程中恢復這個對象**,下面就展示這種使用方法。 還是本章剛開始的那個例子(**在一個進程中修改sUserId的值只會影響當前進程,對其他進程不會造成任何影響**),這次我們在MainActivity的onResume中序列化一個User對象到sd卡上的一個文件里,然后在SecondActivity的onResume中去反序列化,我們期望在SecondActivity中能夠正確地恢復User對象的值。關鍵代碼如下: ``` //在MainActivity中的修改 private void persistToFile() { new Thread(new Runnable() { @Override public void run() { User user = new User(1, "hello world", false); File dir = new File(MyConstants.CHAPTER_2_PATH); if (!dir.exists()) { dir.mkdirs(); } File cachedFile = new File(MyConstants.CACHE_FILE_PATH); ObjectOutputStream objectOutputStream = null; try { objectOutputStream = new ObjectOutputStream( new FileOutputStream(cachedFile)); objectOutputStream.writeObject(user); Log.d(TAG, "persist user:" + user); } catch (IOException e) { e.printStackTrace(); } finally { MyUtils.close(objectOutputStream); } } }).start(); } //SecondActivity中的修改 private void recoverFromFile() { new Thread(new Runnable() { @Override public void run() { User user = null; File cachedFile = new File(MyConstants.CACHE_FILE_PATH); if (cachedFile.exists()) { ObjectInputStream objectInputStream = null; try { objectInputStream = new ObjectInputStream( new FileInputStream(cachedFile)); user = (User) objectInputStream.readObject(); Log.d(TAG, "recover user:" + user); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { MyUtils.close(objectInputStream); } } } }).start(); } ``` 下面看一下log,很顯然,在SecondActivity中成功地從文件從恢復了之前存儲的User對象的內容,這里之所以說內容,是因為**反序列化得到的對象只是在內容上和序列化之前的對象是一樣的,但它們本質上還是兩個對象**。 ``` D/MainActivity(10744): persist user:User:{userId:1, userName:hello world, isMale:false}, with child:{null} D/SecondActivity(10877): recover user:User:{userId:1, userName:hello world, isMale:false}, with child:{null} ``` **通過文件共享這種方式來共享數據對文件格式是沒有具體要求的,比如可以是文本文件,也可以是XML文件,只要讀/寫雙方約定數據格式即可**。 **通過文件共享的方式也是有局限性的,比如并發讀/寫的問題**,像上面的那個例子,**如果并發讀/寫,那么我們讀出的內容就有可能不是最新的,如果是并發寫的話那就更嚴重了。因此我們要盡量避免并發寫這種情況的發生或者考慮使用線程同步來限制多個線程的寫操作**。通過上面的分析,我們可以知道,**文件共享方式適合在對數據同步要求不高的進程之間進行通信,并且要妥善處理并發讀/寫的問題**。 當然,**SharedPreferences是個特例**,眾所周知,**SharedPreferences是Android中提供的輕量級存儲方案,它通過鍵值對的方式來存儲數據,在底層實現上它采用XML文件來存儲鍵值對,每個應用的SharedPreferences文件都可以在當前包所在的data目錄下查看到**。一般來說,它的目錄位于/data/data/package name/shared_prefs目錄下,其中package name表示的是當前應用的包名。 **從本質上來說,SharedPreferences也屬于文件的一種,但是由于系統對它的讀/寫有一定的緩存策略,即在內存中會有一份SharedPreferences文件的緩存,因此在多進程模式下,系統對它的讀/寫就變得不可靠,當面對高并發的讀/寫訪問,Sharedpreferences有很大幾率會丟失數據**,因此,**不建議在進程間通信中使用SharedPreferences**。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看