青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

This Handler class should be static or leaks might occur Android

轉載自:http://www.cnblogs.com/jevan/p/3168828.html

首先解釋下這句話This Handler class should be static or leaks might occur,大致意思就是說:Handler類應該定義成靜態類,否則可能導致內存泄露。

具體如何解決,在國外有人提出,如下:

Issue: Ensures that Handler classes do not hold on to a reference to an outer class

In Android, Handler classes should be static or leaks might occur. Messages enqueued on the application thread's MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class. 

大體翻譯如下:

Handler 類應該應該為static類型,否則有可能造成泄露。在程序消息隊列中排隊的消息保持了對目標Handler類的應用。如果Handler是個內部類,那 么它也會保持它所在的外部類的引用。為了避免泄露這個外部類,應該將Handler聲明為static嵌套類,并且使用對外部類的弱應用。

使用范例:

   

  1. static class MyHandler extends Handler {
  2.                 WeakReference<PopupActivity> mActivity;
  3.    
  4.                 MyHandler(PopupActivity activity) {
  5.                         mActivity = new WeakReference<PopupActivity>(activity);
  6.                 }
  7.    
  8.                 @Override
  9.                 public void handleMessage(Message msg) {
  10.                         PopupActivity theActivity = mActivity.get();
  11.                         switch (msg.what) {
  12.                         case 0:
  13.                                 theActivity.popPlay.setChecked(true);
  14.                                 break;
  15.                         }
  16.                 }
  17.         };
  18.    
  19.         MyHandler ttsHandler = new MyHandler(this);
  20.         private Cursor mCursor;
  21.    
  22.         private void test() {
  23.                 ttsHandler.sendEmptyMessage(0);
  24.         }

原文:http://www.cnblogs.com/savagemorgan/archive/2013/01/23/2872371.html

疑問:是否有其它解決方法?

這個提示就是由于Handler的直接引用會導致相關的Activity、Service等無法被GC。如果這么弱應用的話,會出現空指針,有其它解決方法?

抽時間研究下。

   

 ==================================================================================================================================

 原始代碼:

  1. public class MainActivity extends Activity {
  2.  
  3.    private static int urlIndex = 0;
  4.    private final static String TAG = MainActivity.class.getSimpleName();
  5.    private static final String[] url = {
  6.          "http://vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv1&type=ipad",
  7.          "http://74.82.62.53:1935/liverepeater/13.stream/playlist.m3u8", "http://rtmp.cntv.lxdns.com/live/cctv3/playlist.m3u8", };
  8.  
  9.    private static final int MSG_PLAY = 100;
  10.    private static final int MSG_RUN_ADB = 101;
  11.    Handler playHandler = new Handler() {
  12.       @Override
  13.       public void handleMessage(Message msg) {
  14.          switch (msg.what) {
  15.          case MSG_PLAY:
  16.             urlIndex = urlIndex > url.length - 1 ? 0 : urlIndex;
  17.             videoView.setVideoPath(url[urlIndex]);
  18.             ++urlIndex;
  19.             break;
  20.          case MSG_RUN_ADB:
  21.             killMediaServer();
  22.             break;
  23.          }
  24.       }
  25.    };
  26.  
  27.  
  28.  
  29.    @Override
  30.    protected void onCreate(Bundle savedInstanceState) {
  31.       super.onCreate(savedInstanceState);
  32.       requestWindowFeature(Window.FEATURE_NO_TITLE);
  33.       HHVideoView.create();
  34.  
  35.       setContentView(R.layout.activity_main);
  36.       videoView = ((HHVideoView) findViewById(R.id.videoView));
  37.       videoView.setOnPreparedListener(mPreparedListener);
  38.       videoView.setOnCompletionListener(mCompletionListener);
  39.       videoView.setOnErrorListener(mOnErrorListener);
  40.  
  41.       playHandler.sendEmptyMessage(MSG_PLAY);
  42.  
  43.    }
  44.  
  45.    private HHVideoView videoView = null;
  46.    private MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() {
  47.       public void onPrepared(MediaPlayer paramMediaPlayer) {
  48.          // playerHandler.sendEmptyMessage(uiAction.MEDIAPLAYER_ONPREPAREED);
  49.          videoView.start();
  50.       }
  51.    };
  52.  
  53.    private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
  54.       public void onCompletion(MediaPlayer paramMediaPlayer) {
  55.  
  56.       }
  57.    };
  58.    private MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {
  59.       public boolean onError(MediaPlayer paramMediaPlayer, int paramInt1, int paramInt2) {
  60.  
  61.          return false;
  62.       }
  63.    };
  64.  
  65.    @Override
  66.    public boolean onCreateOptionsMenu(Menu menu) {
  67.       // Inflate the menu; this adds items to the action bar if it is present.
  68.       return true;
  69.    }
  70.  
  71.    public boolean onKeyDown(int keyCode, KeyEvent event) {
  72.       if (event.getAction() == KeyEvent.ACTION_DOWN) {
  73.          switch (keyCode) {
  74.  
  75.          case KeyEvent.KEYCODE_0:
  76.  
  77.             playHandler.sendEmptyMessage(MSG_RUN_ADB);
  78.             break;
  79.  
  80.          case KeyEvent.KEYCODE_DPAD_DOWN:
  81.          case KeyEvent.KEYCODE_DPAD_UP:
  82.  
  83.             playHandler.sendEmptyMessage(MSG_PLAY);
  84.             break;
  85.          }
  86.       }
  87.       return super.onKeyDown(keyCode, event);
  88.  
  89.    }
  90.  
  91. }

修改后的代碼:

  1. //activity code
  2. public class MainActivity extends Activity {
  3.  
  4.    private static int urlIndex = 0;
  5.    private final static String TAG = MainActivity.class.getSimpleName();
  6.    private static final String[] url = {
  7.          "http://vdn.apps.cntv.cn/api/getLiveUrlCommonRedirectApi.do?channel=pa://cctv_p2p_hdcctv1&type=ipad",
  8.          "http://74.82.62.53:1935/liverepeater/13.stream/playlist.m3u8", "http://rtmp.cntv.lxdns.com/live/cctv3/playlist.m3u8", };
  9.  
  10.    PlayHandler playHandler ;
  11.  
  12.  
  13.  
  14.    @Override
  15.    protected void onCreate(Bundle savedInstanceState) {
  16.       super.onCreate(savedInstanceState);
  17.       requestWindowFeature(Window.FEATURE_NO_TITLE);
  18.       HHVideoView.create();
  19.  
  20.       setContentView(R.layout.activity_main);
  21.       videoView = ((HHVideoView) findViewById(R.id.videoView));
  22.       videoView.setOnPreparedListener(mPreparedListener);
  23.       videoView.setOnCompletionListener(mCompletionListener);
  24.       videoView.setOnErrorListener(mOnErrorListener);
  25.  
  26.       playHandler.sendEmptyMessage(PlayHandler.MSG_PLAY);
  27.  
  28.    }
  29.  
  30.    private HHVideoView videoView = null;
  31.    private MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() {
  32.       public void onPrepared(MediaPlayer paramMediaPlayer) {
  33.          // playerHandler.sendEmptyMessage(uiAction.MEDIAPLAYER_ONPREPAREED);
  34.          videoView.start();
  35.       }
  36.    };
  37.  
  38.    private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
  39.       public void onCompletion(MediaPlayer paramMediaPlayer) {
  40.  
  41.       }
  42.    };
  43.    private MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {
  44.       public boolean onError(MediaPlayer paramMediaPlayer, int paramInt1, int paramInt2) {
  45.  
  46.          return false;
  47.       }
  48.    };
  49.  
  50.    @Override
  51.    public boolean onCreateOptionsMenu(Menu menu) {
  52.       // Inflate the menu; this adds items to the action bar if it is present.
  53.       return true;
  54.    }
  55.  
  56.    public boolean onKeyDown(int keyCode, KeyEvent event) {
  57.       if (event.getAction() == KeyEvent.ACTION_DOWN) {
  58.          switch (keyCode) {
  59.  
  60.          case KeyEvent.KEYCODE_0:
  61.  
  62.             playHandler.sendEmptyMessage(PlayHandler.MSG_RUN_ADB);
  63.             break;
  64.  
  65.          case KeyEvent.KEYCODE_DPAD_DOWN:
  66.          case KeyEvent.KEYCODE_DPAD_UP:
  67.  
  68.             playHandler.sendEmptyMessage(PlayHandler.MSG_PLAY);
  69.             break;
  70.          }
  71.       }
  72.       return super.onKeyDown(keyCode, event);
  73.  
  74.    }
  75.    public void setVideoPath() {
  76.       urlIndex = urlIndex > url.length - 1 ? 0 : urlIndex;
  77.       videoView.setVideoPath(url[urlIndex]);
  78.       ++urlIndex;
  79.    }
  80. }

Handler代碼:

  1. //handler code
  2. import java.lang.ref.WeakReference;
  3.  
  4. import android.os.Handler;
  5. import android.os.Message;
  6.  
  7. /**
  8.  * @author jevan
  9.  * @version (1.0 at 2013-7-3)
  10.  *
  11.  */
  12. public class PlayHandler extends Handler {
  13.    public static final int MSG_PLAY = 100;
  14.    public static final int MSG_RUN_ADB = 101;
  15.    WeakReference<MainActivity> mActivity;
  16.  
  17.    PlayHandler(MainActivity activity) {
  18.       mActivity = new WeakReference<MainActivity>(activity);
  19.    }
  20.  
  21.    @Override
  22.    public void handleMessage(Message msg) {
  23.       MainActivity theActivity = mActivity.get();
  24.       if(theActivity == null)
  25.          return;
  26.       switch (msg.what) {
  27.       case MSG_PLAY:
  28.          theActivity.setVideoPath();
  29.          break;
  30.       case MSG_RUN_ADB:
  31.  
  32.          break;
  33.       }
  34.    }
  35. }

 

個人還是傾向使用獨立的Handler(也就是那個外國人的解決方案),上面反映的Activity會被gc掉,導致參數空指針的問題,其實不能算問題。如果Activity被回收掉,那么Handler應該在使用之前對其狀態進行判斷。

個人推薦這個解決方法,當然代碼會多兩行。

posted on 2013-11-14 02:48 楊粼波 閱讀(3490) 評論(2)  編輯 收藏 引用

評論

# re: This Handler class should be static or leaks might occur Android 2014-01-27 18:23 核桃

路過,加油  回復  更多評論   

# re: This Handler class should be static or leaks might occur Android 2014-05-13 17:37 zhoujunhua

if(theActivity == null)return;的檢測是不是有點多余?
handler的實例在activity對象上,如果activity都被回收掉了,自然也不會存在消息發送到handleMessage上了,不知道我的邏輯正確不,不過加上這句判斷總是讓人感覺程序要可靠點。  回復  更多評論   

# re: This Handler class should be static or leaks might occur Android[未登錄] 2014-05-15 13:40 楊粼波

@zhoujunhua 檢測還是嚴謹一點好。  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品三级日韩久久| 久久精品官网| 亚洲欧美精品在线观看| 欧美精品18videos性欧美| 韩国精品在线观看| 午夜精品一区二区三区四区| 亚洲国产精品va在看黑人| 亚洲欧美精品在线观看| 国产精品一区亚洲| 亚洲综合首页| 在线视频欧美日韩| 欧美午夜在线| 欧美一级视频免费在线观看| 亚洲性夜色噜噜噜7777| 国产精品一区二区久激情瑜伽| 久久婷婷国产综合尤物精品 | 免费亚洲视频| 亚洲高清中文字幕| 牛牛国产精品| 男男成人高潮片免费网站| 亚洲欧洲中文日韩久久av乱码| 欧美韩日精品| 欧美日韩三区| 欧美亚洲综合网| 欧美一区二区精品| 尤物视频一区二区| 亚洲国产福利在线| 亚洲午夜精品国产| 久久裸体艺术| 欧美www视频| 一本色道久久综合亚洲精品小说 | 久久av最新网址| 久久av二区| 亚洲经典一区| 一区二区国产日产| 国产亚洲毛片在线| 亚洲国产国产亚洲一二三| 欧美视频日韩视频在线观看| 久久狠狠亚洲综合| 美女国产一区| 亚洲嫩草精品久久| 久久久久女教师免费一区| 日韩一级网站| 性18欧美另类| 日韩亚洲欧美在线观看| 校园春色综合网| 久久久蜜桃一区二区人| 一区二区三区欧美在线| 欧美在线观看视频一区二区三区| 亚洲国产一区在线| 亚洲综合视频网| 亚洲精品免费电影| 午夜宅男久久久| 一本色道久久综合亚洲精品婷婷| 久久av红桃一区二区小说| 在线综合亚洲| 噜噜噜噜噜久久久久久91| 亚洲影视在线| 男女视频一区二区| 久久精品国产成人| 欧美日精品一区视频| 免费人成精品欧美精品| 国产麻豆日韩| 一区二区三区欧美视频| 亚洲日本va在线观看| 午夜久久黄色| 亚洲一区二区在线看| 男人的天堂亚洲在线| 久久久久9999亚洲精品| 欧美日韩视频在线第一区| 免费日韩av片| 国产一区二区你懂的| 亚洲第一天堂无码专区| 亚洲尤物在线| 亚洲免费视频成人| 欧美欧美天天天天操| 欧美大片va欧美在线播放| 国产日韩欧美日韩大片| 中文在线一区| 亚洲一区制服诱惑| 欧美日韩一本到| 亚洲精品免费在线观看| 亚洲国产欧美不卡在线观看| 久久久国际精品| 老司机一区二区| 一区二区三区在线不卡| 久久精品2019中文字幕| 久久久久九九九九| 国产午夜亚洲精品理论片色戒| 亚洲欧美日韩一区二区三区在线观看 | 日韩视频在线一区二区三区| 久久精品99国产精品| 性色av一区二区怡红| 国产精品国产三级国产aⅴ入口| 日韩天天综合| 亚洲欧美在线看| 国产精品久久久久久久久动漫| 99在线|亚洲一区二区| 亚洲一区二区三区免费在线观看| 欧美日韩视频免费播放| 正在播放欧美一区| 亚洲欧美日韩国产综合| 国产欧美日韩一区二区三区| 午夜久久久久久久久久一区二区| 久久黄色小说| 亚洲国产成人久久| 欧美激情 亚洲a∨综合| 99精品视频免费观看| 性做久久久久久免费观看欧美 | 欧美在线观看www| 激情国产一区二区| 欧美激情亚洲另类| 久久激情五月丁香伊人| 亚洲国产成人久久综合| 男女精品网站| 亚洲午夜一级| 美女精品网站| 在线中文字幕一区| 国产欧美日韩亚洲精品| 久久综合久色欧美综合狠狠 | 久久精品一本| 亚洲欧洲午夜| 午夜精品视频一区| 韩国视频理论视频久久| 欧美综合77777色婷婷| 国内成人在线| 欧美日韩国产亚洲一区| 欧美一区二区三区免费观看| 亚洲福利国产| 欧美中文字幕精品| 亚洲麻豆av| 国际精品欧美精品| 欧美破处大片在线视频| 欧美在线一区二区| 99精品欧美一区| 免费不卡在线视频| 午夜精品在线视频| 亚洲精品社区| 激情综合中文娱乐网| 国产精品国产三级国产| 久热精品在线视频| 午夜视频一区在线观看| 日韩视频免费观看| 欧美激情视频给我| 久久久国际精品| 亚洲欧美在线观看| **性色生活片久久毛片| 在线观看视频欧美| 欧美日韩三级| 美女主播一区| 欧美一区二区三区视频在线观看| 日韩网站在线| 亚洲二区视频在线| 免费在线观看日韩欧美| 欧美一二三视频| 一区二区三区四区国产精品| 亚洲第一黄色网| 国产日本欧美一区二区三区| 欧美天天视频| 欧美日韩一区二区免费视频| 欧美一级片一区| 亚洲男人的天堂在线| 亚洲视频在线视频| 日韩一级在线| 夜夜狂射影院欧美极品| 亚洲精品免费在线播放| 亚洲国产免费| 亚洲经典在线| 亚洲国产精品久久| 亚洲丰满在线| 在线不卡亚洲| 亚洲国产精品一区二区尤物区| 黑丝一区二区三区| 国内精品一区二区| 国外成人网址| 在线观看91精品国产入口| 国产一区二区三区网站| 国产一区二区三区av电影| 国产亚洲精品一区二555| 国产午夜精品久久久久久久| 国产老肥熟一区二区三区| 国产精品女人网站| 国产欧美va欧美不卡在线| 国产麻豆视频精品| 国产亚洲精品成人av久久ww| 国内揄拍国内精品久久 | 欧美freesex8一10精品| 欧美二区在线播放| 亚洲高清色综合| 日韩午夜电影在线观看| 亚洲最新在线视频| 亚洲欧美日韩天堂| 久久久亚洲国产美女国产盗摄| 美女视频黄a大片欧美| 嫩草伊人久久精品少妇av杨幂| 欧美精品久久久久久久久久| 欧美日韩在线电影| 国产欧美日本一区二区三区| 一区二区三区自拍| 亚洲精品乱码|