Handler
1:handler
1:Handler对象在哪个线程中创建的,那么Handler就属于哪一个线程。
2:sendMessage方法哪一个Handler调用,就这个handler来处理消息。
处理消息。
1;handleMessage方法进行处理.创建Handler对象的时候进行重写。
2:post方法,传一个Runnable对象给post方法,那么Runnable的run方法就执行在调用post方法的handler对象所在的线程.
sendMessage,sendEmptyMessage,sendMessageAtTime底层都是调用sendMessageAtTime这个方法。
2:Ui线程跟work线程之间互相发送数据。
1:如果Handler在工作线程中创建,必须先调用Looper.prepare().创建完Handler对象后,调用Looper.loop().
(在ActivityThread类,底层已经帮我们已经调用以上的方法。)
3:Handler,Message的机制.
Looper.prepare()----创建Looper对象,去管理Messagequeue..
sendMessageAtTime()-----发消息----enqueueMessage()(将当前的handler对象设置给Message的target对象)---将消息放到Messagequeue里。
Looper.loop--有一个死循环,不断得从Messagequeue里取出消息---Message对象(msg)。------调用msg.target的dispatchMessage方法。------dispatchMessage方法里调用handler对象的handleMessage方法。
相关概念
Message Queue(消息队列):用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列
Handler:可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息
Looper:是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的Handler,Handler接受到消息后调用handleMessage进行处理
Message:消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理
* 下载图片
private ImageView image_main;
private Handler handler =new Handler() {
@Override
public void handleMessage(Message msg) {
//处理其他线程传递过来的消息。
Bitmap bitmap = (Bitmap) msg.obj;
image_main.setImageBitmap(bitmap);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image_main = (ImageView) findViewById(R.id.image_main);
//开启一个线程下载图片。
startThead();
}
private void startThead() {
new Thread(new Runnable() {
@Override
public void run() {
//执行在工作线程中。
String path = "http://img4.duitang.com/uploads/item/201306/20/20130620221932_FVnZK.thumb.600_0.jpeg";
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
;
int code = conn.getResponseCode();
if (code == 200) {
InputStream is = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
//将图片设置给ImageView.
//发送消息
Message msg = new Message();
//arg1,arg2--放的都是整数。 what---类型。也是整数。obj---放的是任意的对象
msg.obj = bitmap;
handler.sendMessage(msg);//发送消息。
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public class MainActivity extends AppCompatActivity {
private ImageView image_main;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image_main = (ImageView) findViewById(R.id.image_main);
//开启一个线程下载图片。
startThead();
}
private void startThead() {
new Thread(new Runnable() {
@Override
public void run() {
//执行在工作线程中。
String path = "http://img4.duitang.com/uploads/item/201306/20/20130620221932_FVnZK.thumb.600_0.jpeg";
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
;
int code = conn.getResponseCode();
if (code == 200) {
InputStream is = conn.getInputStream();
final Bitmap bitmap = BitmapFactory.decodeStream(is);
//显示图片。
handler.post(new Runnable() {
@Override
public void run() {
//工作在ui线程。
Log.i("Main",Thread.currentThread()+"");
image_main.setImageBitmap(bitmap);
}
});
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
广告轮播
private ViewPager vg_main;
private List<ImageView> list;
private int[] imags_id = {R.mipmap.a,R.mipmap.b,R.mipmap.c,R.mipmap.d,R.mipmap.e};
int position = 0;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//定位
vg_main.setCurrentItem(++position,true);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vg_main = (ViewPager) findViewById(R.id.viewpager);
initList();
MyPagerAdapter adapter = new MyPagerAdapter();
vg_main.setAdapter(adapter);
new Thread(new Runnable() {
@Override
public void run() {
//发送消息到主线程。
while(true) {
handler.sendEmptyMessage(1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
private void initList() {
list = new ArrayList<ImageView>();
for(int i=0;i<imags_id.length;i++){
ImageView img = new ImageView(this);
img.setImageResource(imags_id[i]);
list.add(img);
}
}
class MyPagerAdapter extends PagerAdapter{
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(list.get(position%list.size()));
return list.get(position%list.size());
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(list.get(position%list.size()));
}
}
UI线程和工作线程互相传递
public class MainActivity extends AppCompatActivity {
private TextView tv_msg;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
String str = (String) msg.obj;
tv_msg.setText(str);
}
};
private Handler handler2 = new Handler(){
@Override
public void handleMessage(Message msg) {
String str = (String) msg.obj;
tv_msg.setText(str);
Log.i("Main",str);
}
};
private Handler handler_work;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_msg = (TextView) findViewById(R.id.tv_message);
Button btn = null;
}
public void click(View view){
switch (view.getId()){
case R.id.btn_main:
//Ui线程向工作线程发送数据。
Message msg = handler_work.obtainMessage();
msg.obj = "我是main线程发送过来的消息";
handler_work.sendMessage(msg);
break;
case R.id.btn_workThread:
new Thread(new Runnable() {
@Override
public void run() {
Message msg = handler.obtainMessage();
msg.obj = "我是工作线程发送过来的消息";
handler.sendMessage(msg);
Message msg2 = handler2.obtainMessage();
msg2.obj = "我是工作线程发送过来的消息----2";
handler2.sendMessage(msg2);
//创建handler
Looper.prepare();
handler_work = new Handler(){
@Override
public void handleMessage(Message msg) {
String text = (String) msg.obj;
Log.i("work",text);
}
};
Looper.loop();//循环得取出消息。
}
}).start();
break;
}
}
}
倒计时
private Button btn_start;
private TextView tv_time,tv_stop;
private int total = 10;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//设置
int timer = msg.arg1;
tv_time.setText(msg.arg1 + "");
if(timer==0){
btn_start.setEnabled(true);
tv_stop.setVisibility(View.VISIBLE);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
btn_start = (Button) findViewById(R.id.btn_start);
tv_time = (TextView) findViewById(R.id.tv_time);
tv_stop = (TextView) findViewById(R.id.tv_stop);
}
public void click(View view){
//按钮不再可用。
btn_start.setEnabled(false);
tv_stop.setVisibility(View.INVISIBLE);
//改变tv_time时间。
new Thread(new Runnable() {
@Override
public void run() {
int total = 10;
//马上设置。
Message msg = handler.obtainMessage();
msg.arg1 = total;
handler.sendMessage(msg);
for(int i=9;i>=0;i--){
Message msg2 = handler.obtainMessage();
msg2.arg1 = i;
handler.sendMessage(msg2);
Log.i("Main",msg2.arg1+"");
// 睡眠。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
相关文章
- 【黑马Android】(05)短信/查询和添加/内容观察者使用/子线程网络图片查看器和Handler消息处理器/html查看器/使用HttpURLConnection采用Post方式请求数据/开源项目
- node - TypeError: argument handler must be a function 路由报错的原因
- 利用session_set_save_handler()函数将session保存到MySQL数据库中
- 83、android的消息处理机制(图+源码分析)——Looper,Handler,Message
- [React Testing] Test componentDidCatch handler Error Boundaries
- Handler
- Handler用Bundle传值
- Android之MessageQueue、Looper、Handler与消息循环
- [React Testing] Test componentDidCatch handler Error Boundaries
- Android Handler 的必修课一
- SAP CRM和Cloud for Customer中的Event handler(事件处理器)
- Android Handler详解
- 【Android 异步操作】手写 Handler ( 循环者 Looper | Looper 初始化 | Looper 遍历消息队列 MessageQueue )
- 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
- [Android]Can't create handler inside thread that has not called Looper.prepare()
- Android Handler的内存泄露问题+解决方案
- python自定义logger handler
- 【异常】Postman连接WebSocket失败,提示ServletException: No adapter for handler