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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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 楊粼波 閱讀(3485) 評論(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 檢測還是嚴謹一點好。  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区喷汁尤物| 国产美女一区| 亚洲欧美久久久久一区二区三区| 男男成人高潮片免费网站| 亚洲人成人一区二区在线观看| 美日韩精品视频| 亚洲精品一区二区三区四区高清| 久久久久久久久蜜桃| 亚洲国产黄色片| 欧美在线观看网站| 欧美专区在线观看| 国产精品99久久不卡二区| 国产伦精品一区二区三区视频孕妇| 久久精品九九| 久久精品国产视频| 欧美在线日韩精品| 欧美在线综合| 免费观看日韩av| 欧美不卡一卡二卡免费版| 性欧美长视频| 免费欧美日韩国产三级电影| 久久人人爽爽爽人久久久| 亚洲美女在线一区| 亚洲国产清纯| 欧美一区二区三区男人的天堂 | 在线一区免费观看| 噜噜噜91成人网| 欧美 日韩 国产 一区| 久久免费视频在线观看| 欧美在线中文字幕| av成人毛片| 久久久中精品2020中文| 欧美91大片| 欧美日韩国产综合视频在线| 国产精品久久久久久久久免费桃花 | 国产精品主播| 免费观看成人鲁鲁鲁鲁鲁视频 | 一本久道久久综合中文字幕| 亚洲一区二区三区午夜| 麻豆乱码国产一区二区三区| 一本不卡影院| 欧美日韩另类国产亚洲欧美一级| 一区二区三区我不卡| 日韩一区二区电影网| 久久亚洲综合| 女同一区二区| 国产在线欧美日韩| 久久性色av| 欧美日本国产一区| 亚洲国产毛片完整版| 久久精品国产69国产精品亚洲| 亚洲国产精品美女| 欧美精品一区二区三| 精品99视频| 欧美激情欧美狂野欧美精品 | 国产精品九九| 国产美女精品免费电影| 亚洲综合99| 久久嫩草精品久久久精品一 | 久久国产黑丝| 黄色成人在线观看| 久久先锋影音av| 久久精品国亚洲| 亚洲激情黄色| 性欧美18~19sex高清播放| 国产日韩精品久久| 久久综合狠狠| 欧美性猛交一区二区三区精品| 一区二区激情小说| 亚洲午夜精品福利| 亚洲美女在线一区| 久久国产天堂福利天堂| 亚洲国产成人av好男人在线观看| 欧美国内亚洲| 国产精品视频免费| 亚洲一级二级在线| 久久精品五月| 久久久久高清| 亚洲国产三级网| 99国产精品久久久久久久成人热| 亚洲综合精品自拍| 欧美日韩国产页| 亚洲欧洲另类| 亚洲国产高清在线观看视频| 欧美亚洲三区| 国产精品午夜av在线| 亚洲性视频网址| 亚洲一级二级在线| 国产日韩av在线播放| 亚洲一区二区影院| 在线午夜精品自拍| 国产精品国产亚洲精品看不卡15| a4yy欧美一区二区三区| 亚洲国产aⅴ天堂久久| 久久久久一区二区三区| 国内精品模特av私拍在线观看| 欧美一区=区| 亚洲中无吗在线| 国产日韩亚洲欧美精品| 蜜乳av另类精品一区二区| 亚洲欧美欧美一区二区三区| 欧美激情中文字幕乱码免费| 欧美成人免费全部| 一区二区三区国产| 欧美在线视频一区二区| 亚洲第一色在线| 亚洲国产91| 国产精品伦子伦免费视频| 久久精品亚洲| 欧美日韩视频在线一区二区观看视频| 亚洲综合精品一区二区| 亚洲一区久久| 亚洲激情黄色| 欧美一区二区在线看| 一本色道久久综合亚洲精品不| 亚洲午夜精品17c| 1000部精品久久久久久久久| 亚洲人人精品| 亚洲国产经典视频| 欧美一区二区三区久久精品| 一区二区成人精品| 久久国产一区二区三区| 亚洲午夜激情| 欧美日韩一卡二卡| 91久久综合亚洲鲁鲁五月天| 黄色日韩网站视频| 午夜宅男欧美| 亚洲欧美中日韩| 欧美日韩在线播放三区四区| 亚洲国产另类久久久精品极度| 国内精品伊人久久久久av一坑| 亚洲午夜伦理| 亚洲性xxxx| 欧美午夜精品久久久久久久| 日韩一级在线观看| 一区二区三区黄色| 欧美日一区二区在线观看 | 久久精品91| 亚洲一区二区免费看| 欧美日韩在线电影| 亚洲视频你懂的| 欧美一区二区三区在| 欧美福利视频在线观看| 国产毛片一区二区| 欧美在线你懂的| 美女视频黄a大片欧美| 最新69国产成人精品视频免费| 另类酷文…触手系列精品集v1小说| 久久成人人人人精品欧| 国内自拍一区| 欧美日韩理论| 亚洲伊人色欲综合网| 欧美一区三区二区在线观看| 国产午夜精品一区二区三区视频| 久久精品免费电影| 欧美电影在线播放| 亚洲精品裸体| 国产毛片一区二区| 麻豆国产精品777777在线| 亚洲风情在线资源站| 亚洲一区综合| 国内外成人在线视频| 欧美激情视频一区二区三区不卡| 亚洲精品国产精品国产自| 欧美亚洲三区| 99xxxx成人网| 亚洲精品久久久久久久久久久久久| 欧美精品激情在线| 欧美一区二区三区婷婷月色| 亚洲韩日在线| 久久亚洲视频| 欧美中文字幕视频在线观看| 影音先锋久久精品| 玉米视频成人免费看| 国内成人自拍视频| 国产亚洲人成a一在线v站| 欧美视频你懂的| 麻豆精品在线视频| 久久尤物视频| 欧美一站二站| 欧美呦呦网站| 久久理论片午夜琪琪电影网| 亚洲毛片一区二区| 欧美激情第10页| 亚洲娇小video精品| 免费不卡欧美自拍视频| 久久爱www久久做| 久久精品二区三区| 久久精品中文字幕一区| 欧美中文在线字幕| 欧美一级欧美一级在线播放| 日韩视频中文字幕| 夜夜嗨av色一区二区不卡| 一本大道久久a久久精品综合| 亚洲香蕉网站| 宅男精品视频| 欧美在线地址| 欧美国产精品人人做人人爱| 女主播福利一区| 国产精品一卡二卡|