【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工作的原理

posted @ 2017-10-23 15:08  OzTaking  阅读(159)  评论(0)    收藏  举报