线程,线程,还是线程。-----箴言-----
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;
}
}
};
}
