<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發(fā)

      導航

      不要在Android的Application對象中緩存數(shù)據(jù)!

      前言

      ??在你的App中的很多地方都需要使用到數(shù)據(jù)信息,它可能是一個session token,一次費時計算的結果等等,通常為了避免Activity之間傳遞數(shù)據(jù)的開銷,會將這些數(shù)據(jù)通過持久化來存儲。

      ??有人建議將這些數(shù)據(jù)放在Application對象中方便所有的Activity訪問,這個解決方案簡單、優(yōu)雅并且是……完全錯誤的。

      ??你如果你將數(shù)據(jù)緩存到Application對象中,那么有可能你的程序最終會由于一個NullPointerException異常而崩潰掉。

      一個簡單的測試程序

      ??這是自定義Application的代碼:

      // access modifiers omitted for brevity
      class MyApplication extends Application {
       
          String name;
       
          String getName() {
              return name;
          }
       
          void setName(String name) {
              this.name = name;
          }
      }

      ??在第一個Activity中,我們將用戶信息存儲在Application對象中:

      // access modifiers omitted for brevity
      class WhatIsYourNameActivity extends Activity {
       
          void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.writing);
       
              // Just assume that in the real app we would really ask it!
              MyApplication app = (MyApplication) getApplication();
              app.setName("Developer Phil");
              startActivity(new Intent(this, GreetLoudlyActivity.class));
       
          }
       
      }

      ??然后在第二個Activity中通過Application獲取存儲的用戶信息:

      // access modifiers omitted for brevity
      class GreetLoudlyActivity extends Activity {
       
          TextView textview;
       
          void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
       
              setContentView(R.layout.reading);
              textview = (TextView) findViewById(R.id.message);
          }
       
          void onResume() {
              super.onResume();
       
              MyApplication app = (MyApplication) getApplication();
              textview.setText("HELLO " + app.getName().toUpperCase());
          }
      }

      測試步驟

      1. 打開這個APP;

      2. 在WhatIsYourNameActivity中,你按要求輸入用戶名并將其緩存到MyApplication這個對象中;

      3. 接著在GreetLoudlyActivity中,程序從MyApplication對象中取出用戶名并顯示出來;

      4. 用戶按了Home按鍵離開了該APP;

      5. 數(shù)小時之后,系統(tǒng)由于內存不足(用戶在體驗其它APP呢,前臺的任務總是優(yōu)先的嘛)會在后臺將你的程序殺掉;在你重新啟動該APP之前一切看上去很好,但是…..;

      6. 用戶重新打開了這個APP;

      7. Android會重新創(chuàng)建一個之前被Kill掉的MyApplication實例并恢復GreetLoudlyActivity;

      8. GreetLoudlyActivity去獲取用戶名時,會因為獲取的為空值報NullPointerException而崩潰掉。

      為什么會這樣?

      ??在上面這個例子中,程序之所以會崩潰掉是因為恢復之后APP的Application對象是全新的,所以緩存在Application中的用戶 名成員變量為空值,在程序調用String的toUpperCase()方法時由于NullPointerException而崩潰掉。

      ??導致這個問題的主要原因是:Application對象并不是始終在內存中的,它有可能會由于系統(tǒng)內存不足而被殺掉。但Android在你恢復 這個應用時并不是重新開始啟動這個應用,它會創(chuàng)建一個新的Application對象并且啟動上次用戶離開時的activity以造成這個app從來沒有 被kill掉得假象。

      ??我們以為可以通過Application來緩存數(shù)據(jù),卻沒想到恢復APP時直接跑了B Activity而不是先啟動A Activity,最終導致的結果是程序意外的崩潰掉了。

      有哪些替代方法可用呢?

      ??對于數(shù)據(jù)緩存問題我也沒有比較好的辦法,但你可以按照下面其中一種方式來處理:

      • 通過Intent在Activity之間來傳遞數(shù)據(jù)(但是請別傳遞大量數(shù)據(jù),這有可能導致程序異常或者ANR);

      • 使用官方推薦的方法中的一種將數(shù)據(jù)持久化,存儲在磁盤中;

      • 在使用數(shù)據(jù)和句柄的時候做空值檢測;

      posted on 2016-12-09 00:34  安卓筆記俠  閱讀(2576)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 日韩av一区二区精品不卡| 99RE6在线观看国产精品| 营山县| 五月丁香激激情亚洲综合| 国产精品伦人一久二久三久| 成人永久免费A∨一级在线播放| 国产成人综合在线观看不卡| 人妻少妇偷人精品免费看| 亚洲精品国产精品国在线| 黄色免费在线网址| 日本一区二区三区免费播放视频站| 国产又黄又爽又不遮挡视频| 亚洲岛国成人免费av| 日本55丰满熟妇厨房伦| 青青草无码免费一二三区| 午夜福利电影| 99精品人妻少妇一区二区| 久治县| 国产视色精品亚洲一区二区| 人妻中文字幕精品一页| 国产精品久久久国产盗摄| 亚洲欧美日韩综合久久久| 一本色道国产在线观看二区| 午夜大片免费男女爽爽影院| 免费大片av手机看片高清 | 国产精品一二三区久久狼| 激情亚洲内射一区二区三区| 四虎永久免费高清视频| 丝袜a∨在线一区二区三区不卡| 亚洲色av天天天天天天| 视频网站在线观看不卡| 久久精品国产再热青青青| 亚洲无线码在线一区观看| 男女性杂交内射女bbwxz| 国产成人无码www免费视频播放| 国产国语毛片在线看国产| 九九热精品在线免费视频| 成全影视大全在线观看| 欧美人人妻人人澡人人尤物| 成人av天堂网在线观看| 干中文字幕|