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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            国产精品日本精品| 欧美电影免费观看大全| 国产日韩av高清| 免费看亚洲片| 亚洲欧美另类在线| 欧美在线免费视频| 亚洲免费影视| 欧美激情综合在线| 日韩天天综合| 亚洲在线观看免费视频| 国产精品久久综合| 亚洲一区美女视频在线观看免费| 久久久久久久综合狠狠综合| 一区二区三区成人| 欧美日韩国产片| 亚洲三级影片| 99精品国产高清一区二区| 欧美精品www| 在线精品高清中文字幕| 亚洲最新在线视频| 欧美激情一二区| 欧美激情一区二区三区成人| 亚洲美女在线国产| 欧美成人第一页| 亚洲手机视频| 久久综合给合久久狠狠狠97色69| 国语自产在线不卡| 久久亚洲综合色| 欧美三日本三级少妇三99| 久久精品中文| 欧美日韩精品系列| 国产精品99一区| 午夜在线精品偷拍| 欧美韩日一区二区三区| 亚洲免费一级电影| 老鸭窝亚洲一区二区三区| 韩国女主播一区二区三区| 美女精品国产| 亚洲一区日韩在线| 亚洲国产精品悠悠久久琪琪| 日韩亚洲欧美一区| 国内精品视频在线播放| 亚洲欧美www| 久久精品亚洲热| 欧美日韩中文另类| 亚洲人成网站色ww在线| 国产一区清纯| 999亚洲国产精| 日韩天堂在线视频| 久久久青草婷婷精品综合日韩| 欧美在线视频在线播放完整版免费观看 | 性娇小13――14欧美| 欧美激情一区二区三区在线视频观看 | 日韩一本二本av| 亚洲日本黄色| 欧美日韩视频一区二区三区| 欧美成人精品在线| 亚洲高清在线精品| 久久九九精品| 国产伦精品一区二区三| 亚洲日本成人| 亚洲永久网站| 亚洲婷婷在线| 亚洲欧美成aⅴ人在线观看| 日韩午夜视频在线观看| 日韩一二三在线视频播| 一本色道88久久加勒比精品 | 国产精品美女在线观看| 91久久精品久久国产性色也91| 国产有码一区二区| 欧美在线综合| 亚洲国产成人久久| 中文在线不卡| 国产一区二区三区网站| 国产精品美女在线观看| 欧美成人免费网站| 亚洲综合三区| 亚洲小说欧美另类社区| 欧美在线亚洲在线| 久久久久这里只有精品| 亚洲精选国产| 久久久另类综合| 国产美女精品人人做人人爽| 国产一区二区丝袜高跟鞋图片| 国产一区二区在线观看免费播放| 亚洲尤物在线视频观看| 亚洲黄网站在线观看| 国产精品一区亚洲| 国产精品爱啪在线线免费观看| 久热精品视频在线| 午夜精品福利视频| 亚洲视频专区在线| 99在线|亚洲一区二区| 亚洲国产专区校园欧美| 欧美韩日亚洲| 亚洲一区区二区| 欧美激情精品久久久久| 国产美女高潮久久白浆| 亚洲综合色自拍一区| 欧美高清视频一区二区三区在线观看| 午夜精品久久久久影视| 欧美激情亚洲国产| 99国产一区| 久久久噜噜噜久久| 免费视频一区| 久久乐国产精品| 欧美国产极速在线| 国产精品v日韩精品| 欧美日韩一区二区高清| 欧美三级特黄| 国产欧美日韩| 在线看无码的免费网站| 一本色道久久综合亚洲91| 一区二区三区毛片| 国产一区二区成人| 中文日韩欧美| 亚洲综合成人婷婷小说| 亚洲成人在线免费| 亚洲国产精品久久久久秋霞蜜臀| 欧美激情久久久久| 亚洲一品av免费观看| 欧美在线看片| 免费观看30秒视频久久| 黄色在线成人| 久久婷婷av| 在线观看视频免费一区二区三区| 亚洲国产精品国自产拍av秋霞| 亚洲一区在线播放| 91久久久久久国产精品| 亚洲专区一区| 欧美日韩视频在线观看一区二区三区 | 久久婷婷激情| 亚洲欧美在线磁力| 亚洲综合成人在线| 一本色道久久88精品综合| 亚洲视频免费观看| 亚洲成色www8888| 亚洲欧美伊人| 一本色道久久综合| 久久人体大胆视频| 欧美日韩国产一区| av成人免费| 日韩网站在线看片你懂的| 老牛嫩草一区二区三区日本| 一区二区成人精品| 国产女精品视频网站免费| 亚洲午夜精品视频| 亚洲国产精品视频| 欧美精品色一区二区三区| 亚洲精品网址在线观看| 亚洲电影天堂av| 欧美精品一线| 国产精品亚洲综合色区韩国| 久久人91精品久久久久久不卡| 欧美日韩国产精品一卡| 亚洲人成毛片在线播放女女| 一二美女精品欧洲| 欧美黄色一区二区| 最近看过的日韩成人| 亚洲精品国产精品国产自| 欧美理论电影网| 蜜桃精品久久久久久久免费影院| 日韩视频精品在线| 午夜精品免费| 久久久在线视频| 欧美激情亚洲国产| 久久午夜av| 国产美女诱惑一区二区| 91久久久在线| 国产精品视频999| 日韩视频精品在线| 伊人成人开心激情综合网| 日韩视频免费观看高清完整版| 国产自产v一区二区三区c| 一区二区三区欧美| 国产精品丝袜xxxxxxx| 久久精品国产99| 亚洲免费在线观看视频| 国产精品久久久亚洲一区| 欧美在线亚洲| 亚洲一区二区三区777| 久久一综合视频| 久久精品国产免费看久久精品| 亚洲一区二区三区777| 久久一区中文字幕| 狠狠88综合久久久久综合网| 久久久久这里只有精品| 国产免费观看久久| 亚洲免费影视| 久久久久久久久久码影片| 精品91在线| 久久综合五月| 亚洲精品国精品久久99热一| 亚洲国产日韩一区| 欧美精品v日韩精品v国产精品| 91久久午夜| 久久精品久久综合| 欧美交受高潮1| 久久久久久久999精品视频| 久久国产毛片|