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

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
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

轉(zhuǎn)載自:http://www.cnblogs.com/jevan/p/3168828.html

首先解釋下這句話This Handler class should be static or leaks might occur,大致意思就是說:Handler類應(yīng)該定義成靜態(tài)類,否則可能導(dǎo)致內(nèi)存泄露。

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

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 類應(yīng)該應(yīng)該為static類型,否則有可能造成泄露。在程序消息隊(duì)列中排隊(duì)的消息保持了對目標(biāo)Handler類的應(yīng)用。如果Handler是個內(nèi)部類,那 么它也會保持它所在的外部類的引用。為了避免泄露這個外部類,應(yīng)該將Handler聲明為static嵌套類,并且使用對外部類的弱應(yīng)用。

使用范例:

   

  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的直接引用會導(dǎo)致相關(guān)的Activity、Service等無法被GC。如果這么弱應(yīng)用的話,會出現(xiàn)空指針,有其它解決方法?

抽時間研究下。

   

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

 原始代碼:

  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. }

 

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

個人推薦這個解決方法,當(dāng)然代碼會多兩行。

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 核桃

路過,加油  回復(fù)  更多評論   

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

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

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

@zhoujunhua 檢測還是嚴(yán)謹(jǐn)一點(diǎn)好。  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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| 亚洲欧美日韩中文视频| 欧美在线电影| 欧美激情一区二区三区四区| 亚洲国产精品小视频| 亚洲精品一区二区在线| 亚洲女爱视频在线| 狂野欧美性猛交xxxx巴西| 欧美日韩1区2区| 国产精品一区在线观看| 1769国内精品视频在线播放| 在线亚洲美日韩| 久久男女视频| 9l视频自拍蝌蚪9l视频成人| 亚洲资源在线观看| 欧美mv日韩mv国产网站| 国产精品影片在线观看| 亚洲精品韩国| 久久久综合精品| 99国产精品久久久久久久久久| 欧美一区二区三区日韩| 欧美视频一区在线观看| 亚洲国产日韩欧美在线图片| 国产主播精品在线| 狠狠狠色丁香婷婷综合久久五月| 国产麻豆午夜三级精品| 亚洲日本激情| 久久精品国产免费看久久精品| 亚洲电影在线播放| 午夜精品免费在线| 欧美日韩不卡| 亚洲黄网站黄| 久久性天堂网| 亚洲欧美日韩中文视频| 欧美视频福利| 一区二区三区日韩精品| 亚洲国产成人精品久久| 久久精品一区二区三区不卡| 国产日韩一区二区三区| 中文精品视频| 亚洲高清免费在线| 久久亚洲精品伦理| 国产午夜精品理论片a级探花| 制服诱惑一区二区| 91久久精品国产91性色| 另类专区欧美制服同性| 国内精品久久久久影院优| 性欧美videos另类喷潮| 一区二区毛片| 国产精品h在线观看| 中文国产成人精品| 99在线视频精品| 欧美日韩免费高清| 一区二区三区导航| 夜夜嗨av一区二区三区四季av | 亚洲一区二区三区高清不卡| 亚洲第一久久影院| 欧美成人午夜激情在线| 亚洲精品少妇| 日韩午夜在线电影| 国产精品美女一区二区| 亚洲欧美日韩久久精品| 亚洲欧美日韩另类精品一区二区三区| 国产精品视频你懂的| 欧美在线地址| 久久免费视频在线| 最新国产の精品合集bt伙计| 亚洲国产欧美一区二区三区久久 | 日韩香蕉视频| 欧美体内she精视频| 亚洲欧美日韩一区| 亚洲欧美一级二级三级| 一区二区视频免费在线观看| 欧美国产精品日韩| 国内揄拍国内精品少妇国语| 亚洲精品一区二区三| 欧美日韩国产精品成人| 91久久久一线二线三线品牌| 亚洲电影欧美电影有声小说| 欧美激情精品久久久久久久变态 | 亚洲日本成人| 欧美性一区二区| 久久精品国产亚洲高清剧情介绍| 久久婷婷丁香| 99精品视频网| 校园激情久久| 亚洲毛片一区| 午夜精品久久久久久久久久久| 在线日韩欧美| 亚洲视频欧洲视频| 国内自拍亚洲| 一本色道久久88综合亚洲精品ⅰ| 国产亚洲欧美在线| 亚洲欧洲综合另类| 国产亚洲一级高清| 日韩视频一区| 亚洲第一精品影视| 亚洲欧美在线看| 99精品视频一区| 欧美淫片网站| 亚洲欧美日韩一区| 欧美极品在线视频| 狼人天天伊人久久| 亚洲在线视频网站| 99天天综合性| 国产日韩欧美自拍| 亚洲经典三级| 国产美女高潮久久白浆| 欧美激情中文不卡| 国产无遮挡一区二区三区毛片日本| 欧美激情bt| 国产一区二区三区四区老人| 最新日韩在线视频| 在线观看三级视频欧美| 亚洲在线一区| 夜夜躁日日躁狠狠久久88av| 尤物视频一区二区| 香蕉亚洲视频| 亚洲一区二区三区午夜| 欧美国产激情二区三区| 日韩视频永久免费观看| 精品动漫一区二区| 欧美自拍丝袜亚洲| 午夜精品短视频| 欧美午夜精品一区| 亚洲美女色禁图| 一本色道久久88精品综合| 欧美激情久久久久| 亚洲精品综合精品自拍| 日韩一区二区精品视频| 欧美精品在线一区| 亚洲精品一线二线三线无人区| 亚洲美女精品一区| 欧美精品色一区二区三区| 欧美激情一区二区三区成人| 亚洲片国产一区一级在线观看| 免费久久99精品国产| 亚洲国产精品电影| 一本久道久久综合狠狠爱| 欧美日韩网站| 夜夜嗨网站十八久久| 亚洲欧美成人一区二区在线电影| 欧美亚洲第一区| 午夜激情综合网| 久久夜色精品国产| 亚洲精品免费一二三区| 欧美日韩视频不卡| 亚洲综合视频一区| 久久av一区二区三区漫画| 国内精品一区二区三区| 久久天天狠狠| 91久久久亚洲精品| 亚洲欧美日韩一区| 黄色成人在线免费| 欧美区日韩区| 欧美亚洲免费高清在线观看| 欧美成人dvd在线视频| 国产精品99久久久久久人| 国产一区清纯| 欧美日本一道本在线视频| 亚洲欧美另类中文字幕| 欧美激情国产日韩| 欧美在线日韩精品| 亚洲激情网站免费观看| 女同一区二区| 亚洲综合视频在线| 亚洲高清在线精品| 国产精品久久久| 久久久午夜视频| 日韩视频国产视频| 另类成人小视频在线| 亚洲制服少妇| 最新高清无码专区| 国产视频精品xxxx| 欧美另类女人| 久久久99免费视频| 99riav久久精品riav| 开元免费观看欧美电视剧网站| 在线视频亚洲一区| 亚洲大片一区二区三区| 国产精品人人做人人爽人人添| 美女精品在线观看| 欧美影院在线播放| 亚洲视频欧美视频| 亚洲精品日韩精品| 一区二区三区www| 美女精品国产| 中文在线一区| 亚洲三级电影全部在线观看高清| 国产精品一区二区欧美| 欧美日韩亚洲高清一区二区| 久久一区激情| 亚洲免费视频在线观看| 亚洲美女视频在线观看|