原理图:
1)Handler采用消息模式,用于子线程和主线程之间的通信。当子线程完成操作时,就会给主线程发一个
消息。通知主线程进行显示更新。。。
2)只有主线程才能对显示进行操作。
3)activity程序默认是一个单独的线程里面来运行。onCreate() 按钮点击回调事件、对于显示的操作都是在主线程里面运行。主线程也称为UI线程。
4)联网获取数据、大文件的拷贝都需要放置在子线程来操作。
使用
1、main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_number"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="0"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="add"
android:text="增加"
/>
</LinearLayout>
2、MainActivity
package com.njupt.thread_handler1;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
private static final int UPDATE_DISPLAY = 1;
private TextView tv_number;
Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case UPDATE_DISPLAY:
int i = (Integer) msg.obj;
tv_number.setText("章泽天是我的女神。。。"+i + "");
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv_number = (TextView) findViewById(R.id.tv_number);
}
public void add(View v){
new Thread(){
public void run() {
int i = 0;
while(i < 60){
i = i + 1;
SystemClock.sleep(1000);
Message msg = new Message();
msg.what = UPDATE_DISPLAY;
msg.obj = i;
mHandler.sendMessage(msg);
}
};
}.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}