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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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一区二区三区红粉影视| 亚洲欧美中文字幕| 亚洲电影在线免费观看| 亚洲高清不卡一区| 欧美色另类天堂2015| 羞羞视频在线观看欧美| 久久精品久久综合| 99热这里只有成人精品国产| 亚洲午夜一区| 在线看视频不卡| 亚洲蜜桃精久久久久久久| 国产精品久久久91| 欧美电影资源| 国产精品麻豆欧美日韩ww| 国产精品福利在线观看| 一区二区三区在线不卡| 亚洲观看高清完整版在线观看| 欧美日韩国产综合新一区| 久久精品国产96久久久香蕉| 欧美成人午夜影院| 久久精品综合一区| 欧美丰满高潮xxxx喷水动漫| 欧美在线www| 欧美成人精品| 另类av导航| 国产精品永久免费在线| 最新国产精品拍自在线播放| 国产网站欧美日韩免费精品在线观看 | 亚洲免费一级电影| 美玉足脚交一区二区三区图片| 亚洲尤物在线| 欧美成人一区二区三区在线观看| 小黄鸭精品密入口导航| 嫩模写真一区二区三区三州| 性欧美超级视频| 欧美午夜电影在线| 91久久极品少妇xxxxⅹ软件| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美体内she精视频在线观看| 欧美成人一区二免费视频软件| 国产伦精品一区二区三区视频孕妇 | 亚洲乱码一区二区| 久久亚洲国产成人| 久久精品国产999大香线蕉| 欧美特黄视频| 99综合在线| 亚洲午夜精品网| 欧美日韩在线视频一区二区| 亚洲欧洲日产国产网站| 亚洲国产精品久久久久久女王| 久久精品2019中文字幕| 久久av一区二区三区亚洲| 国产精品入口尤物| 亚洲小说欧美另类社区| 亚洲在线播放| 国产美女精品| 欧美亚洲免费高清在线观看| 欧美有码在线视频| 国产精自产拍久久久久久| 亚洲深夜福利| 亚洲综合国产精品| 国产精品你懂的| 午夜精品成人在线| 久久久人成影片一区二区三区 | 亚洲国产欧美久久| 欧美成人午夜免费视在线看片| 亚洲国产乱码最新视频| 91久久极品少妇xxxxⅹ软件| 亚洲免费在线视频| 久久av一区二区三区漫画| 亚久久调教视频| 韩国三级电影一区二区| 久久综合色婷婷| 亚洲激情网站| 亚洲午夜av| 国产一区二区三区免费不卡| 久久久7777| 最新国产精品拍自在线播放| 亚洲欧美国产三级| 国产亚洲视频在线观看| 久久综合亚洲社区| 一区二区三区精密机械公司| 久久精品91| 日韩一区二区福利| 国产精品视频不卡| 麻豆亚洲精品| 国产精品99久久久久久人| 欧美视频不卡中文| 午夜一级在线看亚洲| 欧美国产三级| 午夜在线不卡| 最新成人av网站| 国产啪精品视频| 欧美福利视频在线| 午夜亚洲福利在线老司机| 最近中文字幕日韩精品 | 免费成人在线观看视频| 一区二区三区福利| 一区二区在线观看av| 欧美日韩综合在线| 麻豆国产精品va在线观看不卡| 亚洲天堂第二页| 亚洲丰满少妇videoshd| 久久精品一区四区| 宅男噜噜噜66国产日韩在线观看| 国产在线精品一区二区中文 | 蜜臀久久99精品久久久画质超高清| 日韩视频中文字幕| 欧美高潮视频| 久久免费视频观看| 午夜欧美不卡精品aaaaa| 亚洲精品乱码久久久久久| 国产三级精品三级| 欧美日韩国产综合网| 免费av成人在线| 久久久国产视频91| 亚洲欧美在线aaa| 中文欧美在线视频| 99re热这里只有精品免费视频| 能在线观看的日韩av| 久久国产精品久久久| 午夜精彩视频在线观看不卡 | 欧美精品综合| 欧美高清在线精品一区| 久久人人爽人人爽| 欧美一二三区在线观看| 亚洲欧美国产另类| 亚洲一区二区动漫| 亚洲一区区二区| 中文在线不卡视频| 亚洲午夜视频在线| 亚洲一二三区视频在线观看| 亚洲美女在线观看| 日韩视频免费大全中文字幕| 亚洲精品在线免费观看视频| 日韩西西人体444www| 欧美日韩精品在线观看| 欧美大片18| 欧美日韩国产成人在线91| 欧美激情欧美激情在线五月| 欧美精品aa| 欧美日韩精品一本二本三本| 欧美精品久久久久久久久老牛影院| 免费在线观看日韩欧美| 欧美mv日韩mv亚洲| 欧美国产综合视频| 欧美日韩一区二区三区| 欧美日韩中文精品| 国产欧美日韩亚洲| 国产自产v一区二区三区c| 136国产福利精品导航| 亚洲激情视频| 亚洲无线视频| 欧美不卡视频| 欧美午夜精品久久久久久久| 国产精品日韩| 国产综合亚洲精品一区二| 亚洲国产成人av好男人在线观看| 亚洲精品女人| 新67194成人永久网站| 久久美女性网| 亚洲黄色在线| 亚洲女ⅴideoshd黑人| 久久久午夜视频| 欧美日韩福利视频| 国产亚洲毛片| 一本色道久久综合亚洲精品高清 | 亚洲欧美日韩久久精品| 久久精品成人一区二区三区| 米奇777在线欧美播放| 欧美午夜性色大片在线观看| 激情小说另类小说亚洲欧美| 亚洲日本免费| 久久久久www| a4yy欧美一区二区三区| 久久精品国产免费观看| 欧美日韩国产免费| 国产一区二区欧美| 日韩视频一区| 久久视频一区| 亚洲视频碰碰| 欧美成人首页| 好吊日精品视频| 午夜伦欧美伦电影理论片| 亚洲国产精品精华液网站| 午夜电影亚洲| 国产精品国产三级国产aⅴ9色| 亚洲国产成人久久综合| 欧美亚洲免费电影| 亚洲最新在线| 欧美日韩亚洲不卡| 亚洲精品欧美一区二区三区| 久久久久久久久伊人| 亚洲影视综合|