首页 > 其他分享 >对Handler的一点封装

对Handler的一点封装

时间:2023-05-21 21:32:38浏览次数:35  
标签:Runnable 封装 void Handler static new 一点 public


在Android中,我们经常需要使用 Handler 来进行事务的异步处理。其实对于基于主线程的Handler,没有必要到处去创建。另外对于基于非主线程的 Handler 所对应的Thread应该在什么时候退出,始终是一个很难得抉择。因此我封装了一个基于主线程的Handler以便整个程序使用, 并封装了两个基于非主线程 Handler以便整个程序中使用。因为这个 两个基于非主线程 Handler是用于 整个程序中使用的,所以其对应的线程就不退出(直到进程挂掉),自然就少了其 应Thread应该在何时退出的艰难抉择。
源码如下

private
     
    final
     
    static
     
    Handler
     mainHandler
    =
    new
     
    Handler
    (
    Looper
    .
    getMainLooper
    ());
   private
     
    final
     
    static
     
    HandlerThread
     business0HandlerThread 
    =
     
    new
     
    HandlerThread
    (
    "Business0Handler"
    );
   private
     
    static
     
    Handler
     business0Handler
    ;
   private
     
    final
     
    static
     
    HandlerThread
     business1HandlerThread 
    =
     
    new
     
    HandlerThread
    (
    "Business1Handler"
    );
   private
     
    static
     
    Handler
     business1Handler
    ;
   

   
   /*
   该Handler运行在主线程中,因此一些必须放在主线程来处理的事务可以用该Hanlder来处理
   */
   public
     
    static
     
    Handler
     getMainHandler
    ()
     
    {
    
    return
     mainHandler
    ;
   }
   /*
    
    该Handler主要用于小事务处理,对于一些耗时但30秒钟能执行完的操作,建议大家放到该Handler来处理
   */
   public
     
    static
     
    Handler
     getBusiness0Handler
    ()
     
    {
       
    if
     
    (
    business0Handler 
    ==
     
    null
    )
     
    {
           
    synchronized
    (
    AppUtil
    .
    class
    ){
               
    if
    (
    business0Handler
    ==
    null
    )
     
    {
                   business0HandlerThread
    .
    start
    ();
                   business0Handler 
    =
     
    new
     
    Handler
    (
    business0HandlerThread
    .
    getLooper
    ());
               
    }
           
    }
       
    }
       
    return
     business0Handler
    ;
   }
   

   
   /*
    * 该Handler主要用于大事务处理,它可能会非常繁忙,它也许10分钟或许更久都没有空。
    */
   public
     
    static
     
    Handler
     getBusiness1Handler
    ()
     
    {
       
    if
     
    (
    business1Handler 
    ==
     
    null
    )
     
    {
           
    synchronized
    (
    AppUtil
    .
    class
    ){
               
    if
    (
    business1Handler
    ==
    null
    )
     
    {
                   business1HandlerThread
    .
    start
    ();
                   business1Handler 
    =
     
    new
     
    Handler
    (
    business1HandlerThread
    .
    getLooper
    ());
               
    }
           
    }
       
    }
       
    return
     business1Handler
    ;
   } 
 使用示例 
    
   Runnable
    r 
   =
    
   new
    
   Runnable
   ()

     
   {


      
   @Override

      
   public
    
   void
    run
   ()

      
   {

       
   // TODO Auto-generated method stub


      
   }

     
   };

     getMainHandler
   ().
   post
   (
   r
   );

     
   Runnable
    r0 
   =
    
   new
    
   Runnable
   ()

     
   {


      
   @Override

      
   public
    
   void
    run
   ()

      
   {

       
   // TODO Auto-generated method stub


      
   }

     
   };

     getBusiness0Handler
   ().
   post
   (
   r0
   );

     
   Runnable
    r1 
   =
    
   new
    
   Runnable
   ()

     
   {


      
   @Override

      
   public
    
   void
    run
   ()

      
   {

       
   // TODO Auto-generated method stub


      
   }

     
   };

     getBusiness1Handler
   ().
   post
   (
   r1
   );

使用示例

 
   Runnable
   
    r 
   
   =
   
    
   
   new
   
    
   
   Runnable
   
   ()

   
     
   
   {


   
      
   
   @Override

   
      
   
   public
   
    
   
   void
   
    run
   
   ()

   
      
   
   {

   
       
   
   // TODO Auto-generated method stub


   
      
   
   }

   
     
   
   };

   
     getMainHandler
   
   ().
   
   post
   
   (
   
   r
   
   );

   
     
   
   Runnable
   
    r0 
   
   =
   
    
   
   new
   
    
   
   Runnable
   
   ()

   
     
   
   {


   
      
   
   @Override

   
      
   
   public
   
    
   
   void
   
    run
   
   ()

   
      
   
   {

   
       
   
   // TODO Auto-generated method stub


   
      
   
   }

   
     
   
   };

   
     getBusiness0Handler
   
   ().
   
   post
   
   (
   
   r0
   
   );

   
     
   
   Runnable
   
    r1 
   
   =
   
    
   
   new
   
    
   
   Runnable
   
   ()

   
     
   
   {


   
      
   
   @Override

   
      
   
   public
   
    
   
   void
   
    run
   
   ()

   
      
   
   {

   
       
   
   // TODO Auto-generated method stub


   
      
   
   }

   
     
   
   };

   
     getBusiness1Handler
   
   ().
   
   post
   
   (
   
   r1
   
   );
  

标签:Runnable,封装,void,Handler,static,new,一点,public
From: https://blog.51cto.com/u_15170706/6320239

相关文章

  • 简单封装JWTUtils实现对token的创建和过期时间检查
    想要使用jwt需要先导入依赖<!--https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></depend......
  • 常用的标准LCD驱动芯片,性价比高,稳定性好,多种封装型号选择VK1056
    型号:VK1056BVK1056C品牌:永嘉微电/VINKA封装形式:SOP24SSOP24年份:最新年份VK1056B/C概述:VK1056B/C是56点、内存映象和多功能的LCD驱动,VK1056B的软件配置特性使它适用于多种LCD应用场合,包括LCD模块和显示系统,用于连接主控制器和VK1056B的管脚只有4条,VK1056B......
  • vue3+vant3封装省市区组件
    因为后台返回的数据格式和vant不一致,所以自己遍历循环得到自己想到的格式。省市区的接口并不是一个以children格式,一次性全部获取,而是选择市的时候需要得到省的id,一层一层请求接口才能得到省市区。 父组件:1<selectArea2@addressOnFinish="onChangeArea"3......
  • 通过C++/CLR封装的方式使非托管的C++、VB6.0调用.Net托管代码
    通常.Net的dll只能被加载到对应的虚拟机中运行和调用,而无法直接被低版本的.Net或C++和VB6.0等非托管代码调用。但是实际项目开发过程中我们为了兼容,不得不同时支持这些非托管代码或低版本的运行时。实际上微软提供了多种方式可以实现这种需求,如进程间通讯、COM/ActiveX、C++/CLR。......
  • 面向对象设计里引入 Friend 是对封装性的破坏吗,friend 在 SAP ABAP 里的应用场景
    笔者的SAP技术交流群里,有朋友提问:我想问一个很基础的问题,为什么类要有friend啊反正我工作这些年,在SAP生产代码里没用过友元,只是在生产代码的单元测试代码里用过,原因也就是让单元测试代码能够访问到被测试的生产类的私有属性。代码如下:SAPABAP的帮助文档:在面向对象......
  • web自动化测试入门篇04——selenium+python基础方法封装
      ......
  • @SuppressLint(“HandlerLeak”)
    (347条消息)@SuppressLint(“HandlerLeak”)_androidsj的博客-CSDN博客(347条消息)关于HandlerLeak的一点理解_yuyuanhuang的博客-CSDN博客碰到方法的前面和类的前面有时会出现@SuppressLint或者@SuppressWarnings这样的黄色警告,看起来很不舒服,于是上网搜集了一些相关资料。发......
  • 我所知道的Handler
    简单讲,handler就是两个功能插入消息,enqueuemessage,msg,when从消息队列中遍历所有消息,比对msg.when和当前的when,找到合适的位置插入处理消息,looper.loop会从messagequeue中调用next。取消息,如果消息还没到时间该执行,就会比对时间,下次轮询就通过binder写入,native函数休眠,到时间唤......
  • 记录一次全局异常告警@ExceptionHandler和HandlerExceptionResolver的问题
         最近有同事说之前写的全局异常告警,如果有@Valid的注解,在接入新写的插件告警后,返回信息不打印了。全局异常是基于@ExceptionHandler的全局异常类,主要是ServletMVC的ModelAndView返回的错误信息的捕获。代码如下:   /***@authorxxx*/@RestControlle......
  • element-ui NavMenu 多级嵌套封装
    安装依赖引用依赖/*安装依赖*///安装element-uinpmielement-ui-S//安装vue-fragmentnpmi-svue-fragment/*main.js引入*/importVuefrom'vue';//引用element-uiimportElementUIfrom'element-ui';import'element-ui/lib/theme-chalk/inde......