<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    統(tǒng)計

    留言簿(1)

    DB

    Others

    QA

    Tech Website

    閱讀排行榜

    評論排行榜

    【轉(zhuǎn)】Avoiding Memory Leaks


    剛開始學(xué)習(xí)Anroid開發(fā),沒有什么實(shí)際經(jīng)驗(yàn),最后提出的四條建議,第二條還是不很理解,做個記號,以后解決。為了深入學(xué)習(xí),打算閱讀《深入Java虛擬機(jī)》。
    四條優(yōu)化建議:
  • Do not keep long-lived references to a context-activity (a reference to an activity should have the same life cycle as the activity itself)
  • Try using the context-application instead of a context-activity
  • Avoid non-static inner classes in an activity if you don't control their life cycle, use a static inner class and make a weak reference to the activity inside. The solution to this issue is to use a static inner class with a WeakReference to the outer class, as done in ViewRoot and its W inner class for instance
  • A garbage collector is not an insurance against memory leaks

  • ------------------

    Android applications are, at least on the T-Mobile G1, limited to 16 MB of heap. It's both a lot of memory for a phone and yet very little for what some developers want to achieve. Even if you do not plan on using all of this memory, you should use as little as possible to let other applications run without getting them killed. The more applications Android can keep in memory, the faster it will be for the user to switch between his apps. As part of my job, I ran into memory leaks issues in Android applications and they are most of the time due to the same mistake: keeping a long-lived reference to a Context.

    On Android, a Context is used for many operations but mostly to load and access resources. This is why all the widgets receive a Context parameter in their constructor. In a regular Android application, you usually have two kinds of Context, Activity and Application. It's usually the first one that the developer passes to classes and methods that need a Context:

    @Override
    protected void onCreate(Bundle state) {
    super.onCreate(state);

    TextView label = new TextView(this);
    label
    .setText("Leaks are bad");

    setContentView
    (label);
    }

    This means that views have a reference to the entire activity and therefore to anything your activity is holding onto; usually the entire View hierarchy and all its resources. Therefore, if you leak the Context ("leak" meaning you keep a reference to it thus preventing the GC from collecting it), you leak a lot of memory. Leaking an entire activity can be really easy if you're not careful.

    When the screen orientation changes the system will, by default, destroy the current activity and create a new one while preserving its state. In doing so, Android will reload the application's UI from the resources. Now imagine you wrote an application with a large bitmap that you don't want to load on every rotation. The easiest way to keep it around and not having to reload it on every rotation is to keep in a static field:

    private static Drawable sBackground;

    @Override
    protected void onCreate(Bundle state) {
    super.onCreate(state);

    TextView label = new TextView(this);
    label
    .setText("Leaks are bad");

    if (sBackground == null) {
    sBackground
    = getDrawable(R.drawable.large_bitmap);
    }
    label
    .setBackgroundDrawable(sBackground);

    setContentView
    (label);
    }

    This code is very fast and also very wrong; it leaks the first activity created upon the first screen orientation change. When a Drawable is attached to a view, the view is set as a callback on the drawable. In the code snippet above, this means the drawable has a reference to the TextView which itself has a reference to the activity (the Context) which in turns has references to pretty much anything (depending on your code.)

    This example is one of the simplest cases of leaking the Context and you can see how we worked around it in the Home screen's source code (look for the unbindDrawables() method) by setting the stored drawables' callbacks to null when the activity is destroyed. Interestingly enough, there are cases where you can create a chain of leaked contexts, and they are bad. They make you run out of memory rather quickly.

    There are two easy ways to avoid context-related memory leaks. The most obvious one is to avoid escaping the context outside of its own scope. The example above showed the case of a static reference but inner classes and their implicit reference to the outer class can be equally dangerous. The second solution is to use the Application context. This context will live as long as your application is alive and does not depend on the activities life cycle. If you plan on keeping long-lived objects that need a context, remember the application object. You can obtain it easily by calling Context.getApplicationContext() or Activity.getApplication().

    In summary, to avoid context-related memory leaks, remember the following:

    • Do not keep long-lived references to a context-activity (a reference to an activity should have the same life cycle as the activity itself)
    • Try using the context-application instead of a context-activity
    • Avoid non-static inner classes in an activity if you don't control their life cycle, use a static inner class and make a weak reference to the activity inside. The solution to this issue is to use a static inner class with a WeakReference to the outer class, as done in ViewRoot and its W inner class for instance
    • A garbage collector is not an insurance against memory leaks

    轉(zhuǎn)自:http://developers.androidcn.com/resources/articles/avoiding-memory-leaks.html

    posted on 2011-06-01 14:52 XXXXXX 閱讀(345) 評論(0)  編輯  收藏 所屬分類: Android Dev

    主站蜘蛛池模板: 亚洲av中文无码乱人伦在线播放 | 好紧我太爽了视频免费国产| 女人被免费视频网站| 亚洲熟妇色自偷自拍另类| 最近2019年免费中文字幕高清| 久久亚洲AV无码精品色午夜麻| 国产真人无码作爱视频免费| 久久亚洲精品无码| 免费无码一区二区三区| 91亚洲国产成人久久精品网站| 97在线视频免费播放| 亚洲免费观看网站| 午夜成人免费视频| 青青视频免费在线| 亚洲精品无码专区久久久| 久久免费精彩视频| 亚洲午夜国产精品无卡| 在线观看免费为成年视频| 国产综合激情在线亚洲第一页| 亚洲国产专区一区| 久久九九全国免费| 亚洲av产在线精品亚洲第一站| 大香人蕉免费视频75| 一级毛片在线免费播放| 亚洲av无码av制服另类专区| 91免费在线播放| 国产精品亚洲一区二区无码| 中文字幕专区在线亚洲| 91麻豆国产免费观看| 亚洲精品久久久久无码AV片软件| 亚洲第一永久AV网站久久精品男人的天堂AV | 扒开双腿猛进入爽爽免费视频| 久久精品亚洲日本波多野结衣| 亚洲精品色婷婷在线影院| 久久亚洲免费视频| 亚洲人成人无码.www石榴| 久久亚洲av无码精品浪潮| 18国产精品白浆在线观看免费| 国产精品亚洲一区二区三区在线观看 | 18禁美女黄网站色大片免费观看| 亚洲色成人四虎在线观看 |