1.Handler的主要作用:
1.在新启动的线程当中发送消息。
2.在主线程中获取并处理消息。
2.为什么要使用Handler?
如果不用handler发送消息,然后更新UI可以么?
是不行的。
Android在设计时就封装了一套消息发送,传递,处理机制,如果不遵循这样的机制,就没有办法更新UI,
就会抛出异常信息。
3.Handler的两个用途
1.合理调用安排消息和Runnable对象,使他们在将来的某个点上执行。
2.将一个消息放入到消息队列当中,安排他在非当前线程当中执行。
4.主线程当中已经包含了消息队列MessageQueue,所以handler才能发送处理消息。
开启一个activity时,是否只有一个线程。
不是的,activity生命周期的每一个方法,在开始时都是在其他线程当中的,通过消息处理机制回到了主线程。
5.Message的使用
Message是线程之间传递消息的载体,在其中包含了对消息的描述和任意的数据对象。
获取message的三种方法:
1.通过构造函数来获取: Message msg = new Message();
2.Message的静态方法: Message.obtain();
3.Handler的静态方法: Handler.obtainMessage();
建议使用后两种方法,因为Message的实现中包含了回收在利用机制,可以提高效率,降低内存消耗。
6,分析android当中的消息处理机制
Handler Message Looper MessageQueue
Looper 线程的魔法师
Looper是循环者,可以把普通线程变成循环线程。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare(); //将当前线程初始化为Looper线程
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop(); //开始循环处理消息队列
}
}
关于Looper的理解的总结:
1.每个线程有且最多只有一个Looper对象,它是一个ThreadLocal(线程本地存储对象)。
2.Looper内部有一个消息队列,loop()方法调用后,线程可以不断的从队列中取出消息执行。
实例三:多种方法更新UI
1.在新启动的线程当中发送消息。
2.在主线程中获取并处理消息。
2.为什么要使用Handler?
如果不用handler发送消息,然后更新UI可以么?
是不行的。
Android在设计时就封装了一套消息发送,传递,处理机制,如果不遵循这样的机制,就没有办法更新UI,
就会抛出异常信息。
3.Handler的两个用途
1.合理调用安排消息和Runnable对象,使他们在将来的某个点上执行。
2.将一个消息放入到消息队列当中,安排他在非当前线程当中执行。
4.主线程当中已经包含了消息队列MessageQueue,所以handler才能发送处理消息。
开启一个activity时,是否只有一个线程。
不是的,activity生命周期的每一个方法,在开始时都是在其他线程当中的,通过消息处理机制回到了主线程。
5.Message的使用
Message是线程之间传递消息的载体,在其中包含了对消息的描述和任意的数据对象。
获取message的三种方法:
1.通过构造函数来获取: Message msg = new Message();
2.Message的静态方法: Message.obtain();
3.Handler的静态方法: Handler.obtainMessage();
建议使用后两种方法,因为Message的实现中包含了回收在利用机制,可以提高效率,降低内存消耗。
6,分析android当中的消息处理机制
Handler Message Looper MessageQueue
Looper 线程的魔法师
Looper是循环者,可以把普通线程变成循环线程。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare(); //将当前线程初始化为Looper线程
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop(); //开始循环处理消息队列
}
}
关于Looper的理解的总结:
1.每个线程有且最多只有一个Looper对象,它是一个ThreadLocal(线程本地存储对象)。
2.Looper内部有一个消息队列,loop()方法调用后,线程可以不断的从队列中取出消息执行。
3.Looper可以使普通线程编程循环线程
实例一:实现轮播图片
public class MainActivity extends Activity {
private ImageView iv;
private Handler handler = new Handler();
//把图片资源放置到数组当中。
private int imgs[] = {R.drawable.d_chanzui,R.drawable.d_haha,R.drawable.d_haixiu,R.drawable.d_hehe,R.drawable.d_ku};
//当前被切换到的图片的索引。
private int index;
private MyRunnable runnable = new MyRunnable();
boolean isChange = true;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView)findViewById(R.id.iv);
btn = (Button)findViewById(R.id.stop);
handler.postDelayed(runnable, 2000);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (isChange) {
handler.removeCallbacks(runnable);
btn.setText("点击切换");
isChange = false;
}else {
btn.setText("停止切换");
handler.postDelayed(runnable, 2000);
isChange = true;
}
}
});
}
class MyRunnable implements Runnable{
@Override
public void run() {
index++; //索引坐标增加
index = index%5; //为了能够确保是5张图片循环滚动,不会数组越界
iv.setImageResource(imgs[index]);
//每隔2秒发送一个runnable对象,从而实现循环。
handler.postDelayed(runnable, 2000);
}
}
}
实例二:拦截消息
public class MainActivity extends Activity {
private TextView tv;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
if (msg.what==1) {
String str = (String) msg.obj;
tv.setText(str);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
}
public void click(View view){
switch (view.getId()) {
case R.id.sendbtn:
new Thread(){
public void run() {
Message msg = Message.obtain();
msg.what = 1;
msg.obj = "你能拦截到我么?";
handler.sendMessageDelayed(msg, 5000);
}
}.start();
break;
case R.id.interuptbtn:
handler.removeMessages(1);
tv.setText("拦截成功!!");
break;
default:
break;
}
}
}
实例三:多种方法更新UI
public class SecondActivity extends Activity {
private TextView tv;
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
tv.setText("handler sendmessage method update UI....");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
new Thread() {
public void run() {
handlerPost();
handlerSendMsg();
runUIMethod();
}
}.start();
// viewpost();
}
public void handlerPost() {
handler.post(new Runnable() {
@Override
public void run() {
tv.setText("handler post method update UI....");
}
});
}
public void handlerSendMsg() {
handler.sendEmptyMessage(1);
}
public void runUIMethod() {
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
tv.setText("runOnUiThread method update UI....");
}
});
}
public void viewpost() {
tv.post(new Runnable() {
@Override
public void run() {
tv.setText("viewpost method update UI....");
}
});
}
}