> 文档中心 > Android基础#4:Android Handler的使用,sendMessage等方法的调用

Android基础#4:Android Handler的使用,sendMessage等方法的调用

    线程,线程,还是线程。-----箴言-----

1. Handler简介:

Handler是一种在线程之间进行消息传递的机制。

在Android系统中,当一个Android程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。这里的主线程就是UI线程,UI线程用于更新UI界面。
一些耗时的操作如果运行再主线程,会阻塞UI线程,导致UI界面更新不了,甚至会发生ANR(Application Not Response),应用程序无响应。
这时,就需要一种机制,将这些耗时的操作放在子线程来处理,从而不会影响UI主线程。当需要将数据更新到UI线程时,子线程发消息给UI线程,由UI线程完成界面的刷新。
Android提供了Handler机制,Handler允许用户发送和处理Message(消息)。每一个Handler实例都与 一个单独的线程和该线程的消息队列相关。当创建一个新的Handler,它被绑定到创建它的线程/消息队列线程中,
而创建后的子线程是不能主动更新UI的,需要使用Handler机制返回UI主线程,由主线程来刷新UI; 

2. 使用Handler的一般步骤:

创建handler, 在handler中的handleMessage中进行消息处理,例如,更新数据到UI。
创建子线程,在子线程中处理业务逻辑,将消息通过handler发送给主线程。

3. 例子程序:

例程功能:在子线程中获取当前时间戳,在主线程中用toast来显示。

代码:

public class MainActivity extends Activity {    private static final String TAG = "MainActivity"; private Button mBtn;    private Context mContext; @Override    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "[onCreate]========="); setContentView(R.layout.activity_main); mBtn = findViewById(R.id.init_btn); mBtn.setOnClickListener(new View.OnClickListener() {     @Override     public void onClick(View v) {  startThread();     } }); mContext = this;     }    @Override    protected void onResume() { super.onResume();    }    @Override    protected void onDestroy() { super.onDestroy(); Log.i(TAG, "[onDestroy]=====initOk111=======" + initOk);    }    private void startThread() { new Thread(new Runnable() {     @Override     public void run() {  long currentTime = 0l;  for (int i = 0; i<10; i++) {      //do something      try{   Thread.sleep(300);   currentTime = System.currentTimeMillis();   Log.i(TAG,"[startThread]==="+currentTime);   Message message=new Message();   message.what=0;   message.obj=currentTime;   handler.sendMessage(message);      }catch (Exception e) {   e.printStackTrace();      }  }     } }){ }.start();    }    handler define//    private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) {     switch (msg.what) {  case 0:      Toast.makeText(mContext,"当前时间:" + msg.obj,Toast.LENGTH_SHORT).show();      break;  default:      break;     } }    };}

 

运行效果:   说明: 在子线程中,用sleep函数进行一下阻塞,就可以看到toast提示不断更新。