`

android.os.handler

 
阅读更多

android.os.handler相关知识整理

 

Handler在Android里负责发送和处理消息。它的主要用途有:

  1)按计划发送消息或执行某个Runnanble(使用POST方法);
  2)从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)/用来向不属于自己的线程的队列中加入某个动作
 

Handler中分发消息的一些方法
      post(Runnable)
      postAtTime(Runnable,long)
      postDelayed(Runnable long)
      sendEmptyMessage(int)
      sendMessage(Message)
      sendMessageAtTime(Message,long)
      sendMessageDelayed(Message,long)

      
以上post类方法允许你排列一个Runnable对象到主线程队列中,
      sendMessage
类方法,允许你安排一个带数据的Message对象到队列中,等待更新.

   默认情况下,Handler接受的是当前线程下的消息循环实例(使用Handler(Looper looper)、Handler(Looper looper, Handler.Callback callback)可以指定线程),同时一个消息队列可以被当前线程中的多个对象进行分发、处理(在UI线程中,系统已经有一个Activity来处理了,你可以再起若干个Handler来处理)。在实例化Handler的时候,Looper可以是任意线程的,只要有Handler的指针,任何线程也都可以sendMessage。Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的(handleMessage()方法里不应该有耗时操作,可以将耗时操作放在其他线程执行,操作完后发送Message(通过sendMessges方法),然后由handleMessage()更新UI)。
 

      当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说,你要是点击一个Button,Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,例如:联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,,如果你放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收到Android系统的一个错误提示  "强制关闭", 这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的.这个时候,由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的Message对象(里面包含数据)  ,把这些消息放入主线程队列中,配合主线程进行更新UI

 

分享到:
评论

相关推荐

    Android代码-android-weak-handler

    Memory safer implementation of android.os.Handler Problem Original implementation of Handler always keeps hard reference to handler in queue of execution. Any object in Message or Runnable posted to ...

    android-weak-handler:android.os.Handler的内存安全实现

    android.os.Handler的内存安全实现 问题 Handler的原始实现始终在执行队列中始终保持对处理程序的硬引用。 张贴到android.os.Handler Message或Runnable中的任何对象将在一段时间内被硬引用。 如果创建匿名Runnable...

    Android错误解决方法大集合

    Android 错误解决方法大集合 Android 错误解决方法大集合文章总结了 Android 开发中常见的四个错误解决方法,涵盖了网络连接、安装 APK、SDK 版本和内容描述等多个方面。 一、 android java.net....

    Android:Handler的post()方法和Thread的start()方法执行Thread的run()方法的区别

    import android.os.Handler; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { ...

    Caused by: android.os.NetworkOnMainThreadException错误解决办法

    好久不写Android代码手都生了,找出自己之前写的程序发现跑不了了,也没啥特别的错误提示,就看到一句有用的错误Caused by: android.os.NetworkOnMainThreadException,查了下原因上在4.0之后在主线程里面执行Http...

    android多线程handler/message机制详解

    import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View....

    Android百度地图定位空指针问题解决android.os.Message com.baidu.location.g.f$d.obtainMessage(int, java.lang.Obj

    问题: 在百度地图页面(Activity为singleTask)跳转到别的页面 ,离开地图页面。偶发性空指针,具体日志信息如下: 解决: 1、原本我在生命周期onStop里调用的mlocationClient.stop();...作者:Android_Mr_Zhao

    android 奔溃日志收集 发送邮件到邮箱

    at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:203) at android.app.ActivityThread.main(ActivityThread.java:6361) at java.lang.reflect.Method.invoke...

    安卓客户端向服务器传图片代码

    import android.os.Handler; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; /* * 客户端和服务器图片处理 */ public class MainActivity ...

    Android Studio通过Handler制作简单的计时器

    Message message = handler.obtainMessage(); handler.sendMessage(message); handler.sendEmptyMessageDelayed(0, 1000); // 每秒更新一次 } } ``` `updateTimer`方法负责更新TextView中的计时显示: ```java...

    android Handler详细使用方法实例

    - StartClickListener和EndClickListener两个内部类实现了OnClickListener接口,分别在点击事件发生时调用handler.post和handler.removeCallbacks方法,实现线程的启动和停止。 - Runnable接口的update_thread实例...

    基于Android应用的代码

    import android.os.Handler; import android.os.Message; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.webkit.WebView; public class Activityload ...

    Android编程实现使用handler在子线程中更新UI示例

    import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends ...

    Android 通过LooperThread运行线程持续取得系统时间.rar

     我们需要使用Handler类与Message类来处理运行线程,使用Java的Calendar与Thread类来取得系统时间,在编写代码时别忘了引入android.os.Handler;android.os.Message;java.util.Calendar;等相关类;  在编写时,我们...

    android开发之“小镜子”app源码

    - `android.os.Handler`: 异步消息处理。 - `android.view.SurfaceHolder`: 控制Surface的生命周期。 - `android.view.SurfaceView`: 显示摄像头流的视图组件。 - `android.widget.LinearLayout`: 布局容器。 #...

    android.os.NetworkOnMainThreadException

    文章目录android.os.NetworkOnMainThreadException问题分析查阅资料解决方案知识要点: RunOnUiThread 和 new Thread(new Runnable()).start() 的区别先说一下 RunonUiThread这时候就需要使用 handler来处理消息 ...

    android霓虹灯源代码

    - 使用`handler.postDelayed(this, 300);`来定时(每隔300毫秒)重新调用自身,从而形成连续的颜色变化效果。 - `onCreate(Bundle savedInstanceState)`: Activity生命周期中的一个回调方法,在Activity创建时被...

    宝石迷阵(android源码)

    import org.anddev.andengine.engine.handler.timer.ITimerCallback; import org.anddev.andengine.engine.handler.timer.TimerHandler; import org.anddev.andengine.engine.options.EngineOptions; import org....

    Android应用源码之HandlerMessage2_应用.zip

    Handler,全称`android.os.Handler`,是Android系统提供的一种消息处理机制。它的主要作用是在不同的线程之间传递消息,尤其是主线程(UI线程)与后台线程之间的通信。通过创建Handler实例并关联到特定的线程,我们...

Global site tag (gtag.js) - Google Analytics