19 Handler 子线程向主线程发送信息
2016-09-18 19:11
162 查看
案例一 Message创建三种方法:
案例二 Message几个信息载体:
案例三 几个发送msg的方式:
package com.example.day19_handler_demo1; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { private TextView tv; private int count =0; private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { Log.e("AAA", "=handleMessage=>"+Thread.currentThread().getName()); //处理消息 //获取消息 int num = msg.arg1; //更新数据 tv.setText(num+""); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.tv); // android.view.ViewRootImpl$CalledFromWrongThreadException: // Only the original thread that created a view hierarchy // can touch its views. new Thread(){ public void run() { while(true){ if(count<100){ count++; } Log.e("AAA", "=Thread=>"+Thread.currentThread().getName()); // tv.setText(count+""); //方式一获取Message对象 不建议使用 //Message msg = new Message(); 如果用sendToTarget想要setTarget //方式二获取Message对象 //Message msg = Message.obtain(); 方便后面用sendToTarget //方式三获取Message对象 Message msg = handler.obtainMessage(); //msg携带数据 msg.arg1 = count; //使用Handler发送数据 handler.sendMessage(msg); try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; }.start(); } }
案例二 Message几个信息载体:
package com.qf.day19_handler_demo2; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; public class MainActivity extends Activity { private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { //接收和处理消息的 switch (msg.what) {//根据标记进行处理数据 case 1: int a = msg.arg1; int a2 = msg.arg2; String str = (String) msg.obj; int flag = msg.what; Log.e("AAA", "==a=="+a); Log.e("AAA", "==a2=="+a2); Log.e("AAA", "==str=="+str); Log.e("AAA", "==flag=="+flag); break; case 2: Log.e("AAAA", "AAAAAAAAAAAAAAAA"); break; default: break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //子线程里的数据发送到主线程 public void OnMyClick(View v){ new Thread(){ public void run() { //获取消息的载体对象 Message msg = Message.obtain(); msg.arg1 = 100; msg.arg2 = 200;//arg1,arg2:都是int类型数据 msg.obj = "我是大数据"; //Object对象 string Bitmap List<T> msg.what = 1;//int 类型 标记 handler.sendMessage(msg); }; }.start(); } }
案例三 几个发送msg的方式:
package com.qf.day19_handler_demo4; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView ivShow; Handler handler = new Handler(); Handler handler2 = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: pDialog.show(); break; case 2: Bitmap bitmap = (Bitmap) msg.obj; ivShow.setImageBitmap(bitmap); pDialog.dismiss(); break; default: break; } }; }; private ProgressDialog pDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ivShow = (ImageView) findViewById(R.id.iv_show); pDialog = new ProgressDialog(MainActivity.this); pDialog.setTitle("下载图片"); pDialog.setIcon(R.drawable.ic_launcher); pDialog.setMessage("正在下载中,请稍后..."); } public void MyLoadClick(View v) { //pDialog.show(); //开启子线程下载图片 new Thread(){ public void run() { //在子线程展示 //发送null消息 只设置一个标记 handler2.sendEmptyMessage(1); byte[] data = HttpUtil.getHttpResult("https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=2507878052,3446525205&fm=58"); final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); //第一种方式 将代码块发送到主线程 在内部直接一个匿名内部类runnable 可以直接更新UI(主线程) // handler.post(new Runnable() { // // @Override // public void run() { // // TODO Auto-generated method stub // Log.e("AAA", "=handler=>"+Thread.currentThread().getName()); // // //更新Ui // ivShow.setImageBitmap(bitmap); // pDialog.dismiss(); // } // }); //延迟发送 在内部直接一个匿名内部类runnable 可以直接更新UI(主线程) // handler.postDelayed(r, delayMillis) //第二种方式 使用msg 携带数据到主线程 // Message msg = Message.obtain(); // msg.obj = bitmap; // msg.what = 2; // handler2.sendMessage(msg); // 延迟发送一个msg //handler2.sendMessageDelayed(msg, delayMillis) //第三种 sendToTarget 发送到那个Handler // Message msg = handler2.obtainMessage(); // msg.obj = bitmap; // msg.what = 2; // msg.sendToTarget();//发送给那个Handler //第四种方式 Message msg = Message.obtain(); msg.obj = bitmap; msg.what = 2; msg.setTarget(handler2);//指明是那个Handler msg.sendToTarget();//发送给那个Handler }; }.start(); } }
相关文章推荐
- 19 Handler 子线程向主线程发送信息
- Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
- 19 主线程向子线程发送信息(handler)
- 19 主线程向子线程发送信息(handler)
- Android Handler:主线程如何通知子线程
- Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
- Android之用Handler实现主线程和子线程互相通信以及子线程和子线程之间的通信
- 主线程利用MsgWaitForMultipleObjects等待子线程结束时,同时处理子线程发送的窗口消息
- Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息
- Android用Handler让主线程向子线程发送消息
- Handler发送信息方法的区别
- Handler让主线程和子线程进行通信
- Looper、Handler应用---实现主线程向子线程发送消息
- Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
- Delphi7从子线程中发送消息到主线程触发事件执行
- 主线程有多个Handler, 子线程发送消息由哪个handler处理
- Android主线程向子线程中发送信息
- 主线程的子线程信息pool-1-thread-1
- Android子线程向主线程发送消息实现
- handler 进行主线程与子线程之间的信息传递