当前位置: 首页 > news >正文

ps网站建设要知道的知识兰州网络推广公司哪家好

ps网站建设要知道的知识,兰州网络推广公司哪家好,如何在大网站做外链,盘古网做网站多少钱首先解释下这句话This Handler class should be static or leaks might occur,大致意思就是说:Handler类应该定义成静态类,否则可能导致内存泄露。 具体如何解决,在国外有人提出,如下: Issue: Ensures that…

首先解释下这句话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.                 MyHandler(PopupActivity activity) {
  4.                         mActivity = new WeakReference<PopupActivity>(activity);
  5.                 }
  6.                 @Override
  7.                 public void handleMessage(Message msg) {
  8.                         PopupActivity theActivity = mActivity.get();
  9.                         switch (msg.what) {
  10.                         case 0:
  11.                                 theActivity.popPlay.setChecked(true);
  12.                                 break;
  13.                         }
  14.                 }
  15.         };
  16.         MyHandler ttsHandler = new MyHandler(this);
  17.         private Cursor mCursor;
  18.         private void test() {
  19.                 ttsHandler.sendEmptyMessage(0);
  20.         }

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

疑问:是否有其它解决方法?

这个提示就是由于Handler的直接引用会导致相关的Activity、Service等无法被GC。如果这么弱应用的话,会出现空指针,有其它解决方法?

抽时间研究下。

   

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

 原始代码:

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

修改后的代码:

  1. //activity code
  2. public class MainActivity extends Activity {
  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.    PlayHandler playHandler ;
  9.    @Override
  10.    protected void onCreate(Bundle savedInstanceState) {
  11.       super.onCreate(savedInstanceState);
  12.       requestWindowFeature(Window.FEATURE_NO_TITLE);
  13.       HHVideoView.create();
  14.       setContentView(R.layout.activity_main);
  15.       videoView = ((HHVideoView) findViewById(R.id.videoView));
  16.       videoView.setOnPreparedListener(mPreparedListener);
  17.       videoView.setOnCompletionListener(mCompletionListener);
  18.       videoView.setOnErrorListener(mOnErrorListener);
  19.       playHandler.sendEmptyMessage(PlayHandler.MSG_PLAY);
  20.    }
  21.    private HHVideoView videoView = null;
  22.    private MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() {
  23.       public void onPrepared(MediaPlayer paramMediaPlayer) {
  24.          // playerHandler.sendEmptyMessage(uiAction.MEDIAPLAYER_ONPREPAREED);
  25.          videoView.start();
  26.       }
  27.    };
  28.    private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
  29.       public void onCompletion(MediaPlayer paramMediaPlayer) {
  30.       }
  31.    };
  32.    private MediaPlayer.OnErrorListener mOnErrorListener = new MediaPlayer.OnErrorListener() {
  33.       public boolean onError(MediaPlayer paramMediaPlayer, int paramInt1, int paramInt2) {
  34.          return false;
  35.       }
  36.    };
  37.    @Override
  38.    public boolean onCreateOptionsMenu(Menu menu) {
  39.       // Inflate the menu; this adds items to the action bar if it is present.
  40.       return true;
  41.    }
  42.    public boolean onKeyDown(int keyCode, KeyEvent event) {
  43.       if (event.getAction() == KeyEvent.ACTION_DOWN) {
  44.          switch (keyCode) {
  45.          case KeyEvent.KEYCODE_0:
  46.             playHandler.sendEmptyMessage(PlayHandler.MSG_RUN_ADB);
  47.             break;
  48.          case KeyEvent.KEYCODE_DPAD_DOWN:
  49.          case KeyEvent.KEYCODE_DPAD_UP:
  50.             playHandler.sendEmptyMessage(PlayHandler.MSG_PLAY);
  51.             break;
  52.          }
  53.       }
  54.       return super.onKeyDown(keyCode, event);
  55.    }
  56.    public void setVideoPath() {
  57.       urlIndex = urlIndex > url.length - 1 ? 0 : urlIndex;
  58.       videoView.setVideoPath(url[urlIndex]);
  59.       ++urlIndex;
  60.    }
  61. }

Handler代码:

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

 

个人还是倾向使用独立的Handler(也就是那个外国人的解决方案),上面反映的Activity会被gc掉,导致参数空指针的问题,其实不能算问题。如果Activity被回收掉,那么Handler应该在使用之前对其状态进行判断。

个人推荐这个解决方法,当然代码会多两行。

 

 

 

转载于:https://www.cnblogs.com/jevan/p/3168828.html

http://www.lbrq.cn/news/2518759.html

相关文章:

  • php做的网站源代码seo主要做什么工作内容
  • 专业的集团网站建设搜索引擎下载
  • 中科宁波网站建设小学生摘抄新闻2024
  • 苏州高端网站建设设计公司哪家好西安seo关键字优化
  • 商城类网站建设 数据库企业推广
  • 网页设计你若安好便是晴天作业aso搜索优化
  • 网站换新域名磁力引擎
  • 深圳高端网站建设美工免费推广引流app
  • 企业网站留言板网络推广平台
  • 网站中文域名要到期网络推广公司专业网络
  • 黄南北京网站建设seo排名诊断
  • 手机上那个网站做农产品推广比较好百度搜索优化建议
  • 搭建网站是什么意思重庆seo排名扣费
  • 网站ui外包阿森纳英超积分
  • 上海公司名字培训seo
  • 网站服务器做缓存百度推广合作
  • 网站做收藏本站那样seo站内优化培训
  • 高端定制站开发百度品牌专区怎么收费
  • 单位网站建设维护情况报告推广计划方案
  • 静态网页怎么做网站万网域名续费
  • sns社交网站 有哪些全网营销推广平台有哪些
  • 赤峰做网站多少钱世界新闻最新消息
  • 大连网站建设 青鸟传媒百度如何做推广
  • 浙江凌宇环境建设公司网站网络推广宣传方式
  • 免费网站建设视频代发新闻稿最大平台
  • 做网站人员工资网络营销项目策划书
  • 深圳龙岗网站建设公司seo优化网
  • 网页界面设计视觉空间的三维可视化太原seo全网营销
  • 用html制作网页seo推广优化外包价格
  • seo建站技术电商seo什么意思
  • Python奇幻之旅:从零开始的编程冒险
  • 多模通信·数据采集:AORO P9000U三防平板带来定制化解决方案
  • 基于springboot的零食商城的设计与实现/零食销售系统的设计与实现
  • 【高阶版】R语言空间分析、模拟预测与可视化高级应用
  • 数据结构(5)单链表算法题(中)
  • 【LeetCode 热题 100】(二)双指针