安卓系统中处理程序使用浅析

  

<强> 1。处理程序使用引出

  

现在作为客户,有这样一个需求,当打开活动界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,就类似于各个应用的欢迎闪屏页面),如下图:

  

 Android中处理程序使用浅析

  

作为初学者,可能觉得直接开启一个包含倒序循环的子线程就好了,具体实现如下:

  

        & lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比;   & lt; LinearLayout xmlns: android=" http://schemas.android.com/apk/res/android "   xmlns:工具=" http://schemas.android.com/tools "   android: id=癅 + id/activity_main2”   android: layout_width=" match_parent "   android: layout_height=" match_parent "   android:取向=按怪薄?   工具:上下文=癱om.mly.panhouye.handlerdemo.Main2Activity”比;   & lt; TextView   android:重力="中心"   android: textSize=" 30 sp”   android: layout_width=" match_parent "   android: layout_height=" match_parent "   android:文本="没有数据"   android: id=癅 + id/电视/比;   & lt;/LinearLayout>      

        公开课Main2Activity延伸AppCompatActivity {   TextView电视;   @Override   保护无效alt=" Android中处理程序使用浅析">

  

由此我们发现在安卓开发中,例如上面的示例,我们常常通过一个线程来完成某些操作,然后同步显示对应的视图控件UI上,通过上面的例子我们也知道了安卓中无法直接通过子线程来进行UI更新操作,对于这种情况,Android提供了一套异步消息处理机制处理程序。

  

<强> 2。处理程序实现方法

  

使用处理器实现,修改java代码Main2Activity.java如下:

        包com.mly.panhouye.handlerdemo;   进口android.content.Intent;   进口android.os.Bundle;   进口handler;   进口android.os.Message;   进口android.support.v7.app.AppCompatActivity;   进口android.util.Log;   进口android.widget.TextView;/* *   *处理程序:   * 1处理的消息对象就是消息,理解为要传递的消息数据的封装对象   *消息什么:标记,用来区分多个消息   *消息__arg1、最长:用来传递int类型的数据   *消息obj:可以传递任何类型的对象(对象)   */公开课Main2Activity延伸AppCompatActivity {   公共静态最终int更新=0 x1;   TextView电视;   @Override   保护无效alt=" Android中处理程序使用浅析">

  

结合上文的的代码示例以及上图的实现流程,要使用处理器实现异步消息处理,首先我们需要在主线程中创建处理程序对象并重写handleMessage()方法,然后当子线程中需要进行UI操作时,就创建一个消息对象,并通过Handlerr将这条消息发送出去。之后这条消息会被添加到MessageQueue的队列中等待被处理,而电影则会一直尝试从MessageQueue中取出待处理消息,最后分发回处理程序的handleMessage()方法中。由于Halldler是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线程中运行,从而实现子线程通过处理器机制实现UI线程操作的目的。

  

<强> 4。处理程序内存泄漏分析

  

  

上面的处理程序实现代码中,其实在Android工作室中会提示以下问题:

  

 Android中处理程序使用浅析

  

大致意思就是应该让处理程序类为静态的,不然就会产生内存泄漏。原因也说的很清楚,处理程序被声明为一个非静态内部类或者匿名类可能会阻止外部类的垃圾回收(大家可以了解下安卓的gc回收机制)。过多的内存泄漏使程序占用的内存超出系统限制,导致伯父(内存溢出),程序出错。

  

  

  

(1)在关闭活动时停掉对应的后台线程。线程停止就相当于切断了处理和外部链接的线,活动自然会在合适的时候被回收。

  

(2)如果处理程序是被延迟的消息持有了引用,那就使用处理器的removeCallbacks()方法将消息对象从消息队列移除即可。

  

优化后代码如下:

        包com.mly.panhouye.handlerdemo;   进口android.content.Intent;   进口android.os.Bundle;   进口handler;   进口android.os.Message;   进口android.support.v7.app.AppCompatActivity;   进口android.util.Log;   进口android.widget.TextView;   进口java.lang.ref.WeakReference;   公开课Main4Activity延伸AppCompatActivity {   公共静态最终int更新=0 x1;   TextView电视;   @Override   保护无效alt=" Android中处理程序使用浅析">

安卓系统中处理程序使用浅析