1. handler用来更新UI,因为只能在UI线程里更新UI;
2. handler是Android里的一种消息处理机制,可以发送和处理消息,也是一种更新UI的机制,最根本的是为了解决多线程并发的问题;
3. handler更新UI的方法,使用post。
package com.example.kirito.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
/**
* Created by kirito on 2016.10.12.
*/
public class TestHandler extends Activity {
private TextView tv;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testhandler);
tv = (TextView) findViewById(R.id.tv_handler);
new Thread(new Runnable() {
@Override
public void run() {
//使用post在Thread里更新UI(TextView)
handler.post(new Runnable() {
@Override
public void run() {
tv.setText("update UI");
}
});
}
}).start();
}
}
4.使用handler.postDelay,实现图片的轮询切换。
package com.example.kirito.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ImageView;
import android.widget.TextView;
/**
* Created by kirito on 2016.10.12.
*/
public class TestHandler extends Activity {
private TextView tv;
private Handler Myhandler = new Handler();
private MyRunnable runnable = new MyRunnable();
private ImageView iv;
private int index = 0;
private int images[] = {R.drawable.a,R.drawable.b,R.drawable.check};
/**
* 使用MyRunnable来轮询切换图片
*/
private class MyRunnable implements Runnable{
@Override
public void run() {
index++;
index %= 3;
iv.setImageResource(images[index]);
//postDelayed是关键
Myhandler.postDelayed(runnable,1000);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testhandler);
iv = (ImageView) findViewById(R.id.iv_handler);
//启动MyHandler
Myhandler.postDelayed(runnable,1000);
}
}
5.使用handler的sendMessage方法来更新UI
package com.example.kirito.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import android.widget.TextView;
/**
* Created by kirito on 2016.10.12.
*/
public class TestHandler extends Activity {
private TextView tv;
//使用handler的handleMessage更新UI
private Handler Myhandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
tv.setText(msg.arg1 + "");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testhandler);
tv = (TextView) findViewById(R.id.tv_handler);
new Thread(){
@Override
public void run() {
super.run();
Message msg = new Message();//使用Message的Object参数可以传递更多信息
//msg的生成可以使用handler的obtainMessage方法
msg.arg1 = 88; //handler发送消息 Myhandler.sendMessage(msg); } }.start(); }}
6.
//移除运行的Runnable handler.removeCallbacks(runnable);
7.Handler添加CallBack拦截消息的传送
package com.example.kirito.myapplication; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; /** * Created by kirito on 2016.10.12. */ public class TestHandler extends Activity { private TextView tv; //使用handler的handleMessage更新UI private Handler Myhandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); tv.setText(msg.arg1); } }; private Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { Toast.makeText(getApplicationContext(),"1.1",Toast.LENGTH_SHORT).show(); return false;//若设置为true下面的hangdleMessage方法将不会执行,消息被截获 } }){ @Override public void handleMessage(Message msg) { Toast.makeText(getApplicationContext(),"1.2",Toast.LENGTH_SHORT).show(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.testhandler); //发送一个空消息 handler.sendEmptyMessage(1); } }