【0034】Android基础-22-Handler的使用
【1】问题的引出:
【接【0032】Android基础-21-2.网络源码查看器】


【源码】
# 02 消息机制的写法(重要) Handler 使用Handler的步骤: 1.主线程中创建一个Handler private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { }; }; 2.重写handler的handlermessage方法 3.子线程中创建一个Message对象,将获取的数据绑定给msg Message msg = new Message(); //另一种方式:Message msg = Messge.obtain; msg.obj = result; 4.主线程中的handler对象在子线程中将message发送给主线程 handler.sendMessage(msg); 5.主线程中handlermessage方法接受子线程发来的数据,就可以做更新UI的操作。 ***********主线程 //☆☆☆1.在主线程中创建一个Handler对象 private Handler handler = new Handler(){ //☆☆☆2.重写handler的handlermessage方法,用来接收子线程中发来的消息 public void handleMessage(android.os.Message msg) { //☆☆☆5.接收子线程发送的数据,处理数据。 Bitmap bitmap = (Bitmap) msg.obj; //☆☆☆6.当前方法属于主线程可以做UI的更新 //五.获取服务器返回的内容,显示到textview上 img_pic.setImageBitmap(bitmap);//设置ImageView的图片内容 }; }; ************子线程 if(code == 200){ //5.获取有效数据,并将获取的流数据解析成String InputStream inputStream = connection.getInputStream(); //将一个读取流转换成一个图片 Drawable , Btimap:位图 ????? Bitmap bitmap = BitmapFactory.decodeStream(inputStream); //☆☆☆3.子线中创建一个Message对象,为了携带子线程中获取的数据给主线程。 Message msg = Message.obtain();//获取一个Message对象,内部实现是:如果之前的Message存在直接返回,不存在创建新的Message返回 msg.obj = bitmap;//将获取的数据封装到msg中。 //☆☆☆4.使用handler对象将message发送到主线程。 handler.sendMessage(msg); }
1 package layoutdemo.com.example.a1netsourcecodeinsight; 2 3 import android.content.Context; 4 import android.os.Handler; 5 import android.os.Message; 6 import android.support.v7.app.AppCompatActivity; 7 import android.os.Bundle; 8 import android.view.View; 9 import android.widget.Button; 10 import android.widget.EditText; 11 import android.widget.TextView; 12 import android.widget.Toast; 13 14 import java.io.IOException; 15 import java.io.InputStream; 16 import java.net.HttpURLConnection; 17 import java.net.MalformedURLException; 18 import java.net.URL; 19 import java.net.URLConnection; 20 21 import layoutdemo.com.example.StreamUtil.StreamUtil; 22 23 public class MainActivity extends AppCompatActivity implements View.OnClickListener { 24 private EditText et_url; 25 private TextView tv_performCode; 26 private Context mContext; 27 @Override 28 protected void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 setContentView(R.layout.activity_main); 31 32 //1.找到控件 33 Button bt_searchURL = (Button) findViewById(R.id.bt_searchURL); 34 et_url = (EditText) findViewById(R.id.et_url); 35 tv_performCode = (TextView) findViewById(R.id.tv_performCode); 36 //2.设置点击事件 37 bt_searchURL.setOnClickListener(this); 38 System.out.println("onCreate:"+Thread.currentThread().toString()); 39 40 41 42 } 43 44 //☆☆☆1.在主线程中:增加handler 45 Handler handler = new Handler(){ 46 //☆☆☆2.接收msg信息,并处理 47 @Override 48 public void handleMessage(Message msg) { 49 tv_performCode.setText((String)msg.obj); 50 } 51 }; 52 53 @Override 54 public void onClick(View view) { 55 //3.获取输入的地址 56 final String urlString = et_url.getText().toString().trim(); 57 System.out.println("onClick:"+Thread.currentThread().toString()); 58 //4.查询获取的地址的内容 59 /* 60 * 需要使用到UrlConnetion类; 61 * */ 62 try { 63 new Thread(new Runnable() { 64 @Override 65 public void run() { 66 67 System.out.println("onClick:run()"+Thread.currentThread().toString()); 68 try { 69 //4.1创建一个url对象 70 URL url = new URL(urlString); 71 //4.2获取一个urlConnection对象 72 HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 73 //4.3 为HttpURLConnection对象设置一些参数,请求方式,连接的超时时间 74 connection.setRequestMethod("GET"); 75 System.out.println("11111111"); 76 connection.setReadTimeout(1000); 77 //4.4 获取响应码 78 int code = connection.getResponseCode(); 79 if (code == 200){ 80 //5.获取有效的数据,并将数据解析成为String 81 InputStream stream = connection.getInputStream(); 82 String result = StreamUtil.streamToString(stream); 83 //☆☆☆3.将线程的消息封装,封转之后发送; 84 Message message = new Message(); 85 message.obj = result; 86 handler.sendMessage(message); 87 } 88 } catch (Exception e) { 89 e.printStackTrace(); 90 } 91 92 } 93 }).start(); 94 95 } catch (Exception e) { 96 e.printStackTrace(); 97 } 98 99 100 } 101 }
【关键源码】
1 //☆☆☆1.在主线程中:增加handler 2 Handler handler = new Handler(){ 3 //☆☆☆2.接收msg信息,并处理 4 @Override 5 public void handleMessage(Message msg) { 6 tv_performCode.setText((String)msg.obj); 7 } 8 }; 9 ===================== 10 new Thread(new Runnable() { 11 @Override 12 public void run() { 13 14 System.out.println("onClick:run()"+Thread.currentThread().toString()); 15 try { 16 //4.1创建一个url对象 17 URL url = new URL(urlString); 18 //4.2获取一个urlConnection对象 19 HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 20 //4.3 为HttpURLConnection对象设置一些参数,请求方式,连接的超时时间 21 connection.setRequestMethod("GET"); 22 System.out.println("11111111"); 23 connection.setReadTimeout(1000); 24 //4.4 获取响应码 25 int code = connection.getResponseCode(); 26 if (code == 200){ 27 //5.获取有效的数据,并将数据解析成为String 28 InputStream stream = connection.getInputStream(); 29 String result = StreamUtil.streamToString(stream); 30 //☆☆☆3.将线程的消息封装,封转之后发送; 31 Message message = new Message(); 32 message.obj = result; 33 handler.sendMessage(message); 34 } 35 } catch (Exception e) { 36 e.printStackTrace(); 37 } 38 39 } 40 }).start();
【2】Handler工作的原理


浙公网安备 33010602011771号