UI (User Interface)
当应用程序启动时,系统会为应用程序创建一个主线程(main)或者叫UI线程,主线程负责UI的创建,刷新
Activity中的控件的刷新由主线程负责,其它线程不能直接刷新
Message对象
Message用于存放消息,与Handler类配合使用
在主线程中从消息对列中接收消息,根据消息的信息决定如何更新主线程中UI
sendMessage(Message msg);
从工作线程向主线程发送消息
handleMessage(Message msg);接收并处理从工作线程发送过来的消息对象
当应用程序启动时,系统会为应用程序创建一个主线程(main)或者叫UI线程,主线程负责UI的创建,刷新
Activity中的控件的刷新由主线程负责,其它线程不能直接刷新
Message对象
Message用于存放消息,与Handler类配合使用
1.Handler 通过SendMessage更新UI
Handler对象通过在工作线程中发送消息,该消息发送至消息对列中,等待处理在主线程中从消息对列中接收消息,根据消息的信息决定如何更新主线程中UI
sendMessage(Message msg);
从工作线程向主线程发送消息
handleMessage(Message msg);接收并处理从工作线程发送过来的消息对象
eg:
两个工作线程向主线程发送不同的消息,主线程接收消息并显示不同的处理
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button bt1;
private Button bt2;
private TextView tv;
private Handler mHandler;
public static final int BUTTON_ONE =1;
public static final int BUTTON_TWO =2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1 = (Button)findViewById(R.id.button1);
bt2 = (Button)findViewById(R.id.button2);
tv = (TextView)findViewById(R.id.textView);
bt1.setOnClickListener(this);
bt2.setOnClickListener(this);;
//1)主线程中创建handler
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case BUTTON_ONE:
//显示收到的消息
tv.setText(msg.obj.toString());
break;
case BUTTON_TWO:
tv.setText(msg.obj.toString());
break;
}
}
};
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button1:
//2)创建工作线程处理其它的事件
new Thread(){
@Override
public void run() {
super.run();
//do something
for(int i=0; i<10; i++) {
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
}
//3)创建 Message对象
Message msg = new Message();
msg.what=BUTTON_ONE;
msg.obj ="hello this is thread 1";
mHandler.sendMessage(msg);
}
}.start();
break;
case R.id.button2:
new Thread(){
@Override
public void run() {
super.run();
for(int i=0; i<5;i++){
try {
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
Message msg = new Message();
msg.what = BUTTON_TWO;
msg.obj = "hello this is thread work 2";
mHandler.sendMessage(msg);
}
}.start();
break;
}
}
}
2.Handler发送Runable对象更新UI
Handler.post()方法
Handler类中有一个方法post(Runnable r);
作用:将Runnable对象作为参数发送至消息对列中,由Looper交给主线程处理
Runnable.run中的代码可以在主线程中运行,在Runnable.run方法中可以编写
更新主线程UI的代码
//在Runnable.run方法中更新UI
new Thread(){
@Override
public void run() {
super.run();
//耗时操作
for(int i=0; i<5;i++){
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
}
mHandler.post(new Runnable() {
@Override
public void run() {
tv.setText("I am mHandler.post update UI");
}
});
}
}.start();
3.runOnUiThread()发送Runnable对象更新UI
Activity类提供了runOnUiThread方法,它封装了Handler.post方法,作用与Handler.post相同
new Thread(){
@Override
public void run() {
super.run();
//耗时操作
for(int i=0; i<6;i++){
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
}
Runnable runnable = new Runnable() {
@Override
public void run() {
tv.setText("From RunOnUIthread");
}
};
runOnUiThread(runnable);
}
}.start();