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提示不断更新。