php直播平台源码,Android异步消息处理

PHP直播平台源码中异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列中取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环。若消息队列为空,线程则会阻塞等待。Handler运行需要底层的MessageQueue和Looper支撑。其中MessageQueue采用的是单链表的结构,Looper会以无限循环的形式去查找是否有新消息,如果有的话,就处理,否则就一直等待着使用
1.post(Runnable)

new Thread(new Runnable() {
     
   @Override
   public void run() {
     
       /**
          耗时操作
        */
      handler.post(new Runnable() {
     
          @Override
          public void run() {
     
              /**
                更新UI
               */
          }
      });
   }
 }).start();

2.sendMessage(Message)

private Handler handler = new Handler(){
     
    @Override
    public void handleMessage(Message msg) {
     
        super.handleMessage(msg);
        switch (msg.what) {
           //判断标志位
            case 1:
                /**
                 获取数据,更新UI
                */
                break;
        }
    }
};
   
public class WorkThread extends Thread {
     

    @Override
    public void run() {
     
        super.run();
       /**
         耗时操作
        */
     
        //从全局池中返回一个message实例,避免多次创建message(如new Message)
        Message msg =Message.obtain();  
        msg.obj = data;
        msg.what=1;   //标志消息的标志
        handler.sendMessage(msg);
    } 
} 
new WorkThread().start();

3.Handler.postDelayed

//两秒后调用此Runnable对象
handler.postDelayed(runnable, 2000);

如果想关闭定时器,可使用

handler.removeCallbacks(runnable);

Handler引发的内存泄漏问题
PHP直播平台源码,非静态内部类和匿名内部类都默认持有外部类的引用,在Handler处理消息的时候,Handler必须处理完所有消息才会与外部类解除引用关系,如果此时外部Activity需要提前被销毁了,而Handler因还未完成消息处理而继续持有外部Activity的引用。所以,垃圾回收器(GC)便无法回收Activity,从而造成内存泄漏
解决方式
静态内部类+弱引用
因为静态内部类不会持有外部类的引用,在垃圾回收器扫描时,一旦发现了具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存

// 设置为:静态内部类
    private static class FHandler extends Handler{
     

        // 定义 弱引用实例
        private WeakReference reference;
        // 在构造方法中传入需持有的Activity实例
        public FHandler(Activity activity) {
     
            // 使用WeakReference弱引用持有Activity实例
            reference = new WeakReference(activity); }
        // 复写handlerMessage() 
        @Override
        public void handleMessage(Message msg) {
     
            switch (msg.what) {
     
                case 1:
                 //更新UI
                    break;
                case 2:
                //更新UI
                    break;
            }

AsyncTask

/**
  * 步骤1:创建AsyncTask子类
  * 注: 
  *   a. 继承AsyncTask类
  *   b. 为3个泛型参数指定类型;若不使用,可用java.lang.Void类型代替
  *   c. 根据需求,在AsyncTask子类内实现核心方法
  */

  private class MyTask extends AsyncTask {
     
      // 方法1:onPreExecute()
      // 作用:执行 线程任务前的操作
      @Override
      protected void onPreExecute() {
     
           ...
        }

      // 方法2:doInBackground()
      // 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果
      @Override
      protected String doInBackground(String... params) {
     

            ...// 自定义的线程任务

            // 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()
             publishProgress(count);
         }

      // 方法3:onProgressUpdate()
      // 作用:在主线程 显示线程任务执行的进度
      // 注:根据需求复写
      @Override
      protected void onProgressUpdate(Integer... progresses) {
     
            ...
        }

      // 方法4:onPostExecute()
      // 作用:接收线程任务执行结果、将执行结果显示到UI组件
      // 注:必须复写,从而自定义UI操作
      @Override
      protected void onPostExecute(String result) {
     
         ...// UI操作
        }
  }

/**
  * 步骤2:创建AsyncTask子类的实例对象(即 任务实例)
  * 注:AsyncTask子类的实例必须在UI线程中创建
  */
  MyTask mTask = new MyTask();
 // 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常
  mTask.execute()

以上就是关于PHP直播平台源码中,异步消息处理的代码。更多信息欢迎关注之后的文章
本文转载自网络,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理

你可能感兴趣的:(技术类,java,android,多线程,jvm,编程语言)