[Android] Handler应用简单解析

代码 代码 1344 人阅读 | 0 人回复

<
媒介

Handler是Android使用比力普遍的工具,了解Handler的感化战怎样使用,对了解Android有很年夜的感化。
Handler是甚么

A Handler allows you to send and process Message and Runnable objects associated with a thread&#39;s MessageQueue. Each Handler instance is associated with a single thread and that thread&#39;s message queue. When you create a new Handler it is bound to a Looper. It will deliver messages and runnables to that Looper&#39;s message queue and execute them on that Looper&#39;s thread.
Handler许可您收收战处置取线程MessageQueue联系关系的动静战可运转工具。每一个Handler真例皆取一个线程战该线程的动静行列相干联。创立新的Handler时,它将绑定到一个Looper。它将动静战runnables通报到该Looper的动静行列,并正在该Looper的线程上施行它们。
Handler的感化

There are two main uses for a Handler: (1) to schedule messages and runnables to be executed at some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.
Handler有两个次要用处:(1)摆设动静战runnables正在未来某个时分施行;(2)摆设正在差别线程上施行行动。
Handler的俭朴使用

上面的代码片断展现Handler最经常使用的场景,次要感化是派收动静。上面的handler利用MainActivity的Looper,其Thread ID也战MainActivity不异。
  1. public class MainActivity extends AppCompatActivity {
  2.     private final static String TAG = "HandlerTest";
  3.     @Override
  4.     protected void onCreate(Bundle savedInstanceState) {
  5.         super.onCreate(savedInstanceState);
  6.         setContentView(R.layout.activity_main);
  7.         Log.i(TAG, "onCreate: PID = " + Os.getpid() + ", TID = " + Os.gettid());
  8.     }
  9.     Handler mHandler = new Handler() {
  10.         @Override
  11.         public void handleMessage(@NonNull Message msg) {
  12.             super.handleMessage(msg);
  13.             Log.i(TAG, "handleMessage: msg.what = " + msg.what);
  14.             Log.i(TAG, "handleMessage: PID = " + Os.getpid() + ", TID = " + Os.gettid());
  15.             switch (msg.what) {
  16.                 case 1:
  17.                     Log.i(TAG, "handleMessage: do something here");
  18.                     break;
  19.                 default:
  20.                     break;
  21.             }
  22.         }
  23.     };
  24.     @Override
  25.     protected void onResume() {
  26.         super.onResume();
  27.         mHandler.sendEmptyMessage(1);
  28.     }
  29. }
复造代码
创立新的Handler Thread

上面的代码创立了新的Handler Thread,留意:上面的Handler处正在新的thread中,其Thread ID取MainActivity的Thread ID差别,假如需求正在此Handler中操纵当前Activity的UI,需求召唤runOnUiThread(), 正在runOnUiThread()中,其Thread ID取MainActivity一样。
  1. public class MainActivity extends AppCompatActivity {
  2.     private final static String TAG = "HandlerTest";
  3.     @Override
  4.     protected void onCreate(Bundle savedInstanceState) {
  5.         super.onCreate(savedInstanceState);
  6.         setContentView(R.layout.activity_main);
  7.         Log.i(TAG, "onCreate: PID = " + Os.getpid() + ", TID = " + Os.gettid());
  8.     }
  9.     Handler backgroundHandler;
  10.     @Override
  11.     protected void onResume() {
  12.         super.onResume();
  13.         HandlerThread backgroundHandlerThread = new HandlerThread("BackgroudHandlerThread");
  14.         backgroundHandlerThread.start();
  15.         backgroundHandler = new Handler(backgroundHandlerThread.getLooper()) {
  16.             @Override
  17.             public void handleMessage(@NonNull Message msg) {
  18.                 super.handleMessage(msg);
  19.                 Log.i(TAG, "background handleMessage: msg.what = " + msg.what);
  20.                 Log.i(TAG, "background handleMessage: PID = " + Os.getpid() + ", TID = " + Os.gettid());
  21.                 runOnUiThread(new Runnable() {
  22.                     @Override
  23.                     public void run() {
  24.                         Log.i(TAG, "runOnUiThread: PID = " + Os.getpid() + ", TID = " + Os.gettid());
  25.                     }
  26.                 });
  27.             }
  28.         };
  29.         backgroundHandler.sendEmptyMessage(2);
  30.     }
  31. }
复造代码
代码

感爱好的读者能够从gitee下载测试代码,
https://gitee.com/guangwei_jiang/handler-test
小结

Handler能够非常便利使用于动静派收中,默许状况下,其运转正在Activity的main thread中;假如需求运转正在新的thread中,需求利用HandlerThread()创立新的thread, 并将其Looper赋给Handler。

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则