通过Handler通知主线程更新UI(异步消息处理机制)
TextView text;
public static final int UPDATE_TEXT = 1;
private Handler handle = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what)
        {
            case UPDATE_TEXT:
                text.setText((String)msg.obj);
                break;
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {

    text =  (TextView)findViewById(R.id.textView3);
    Button button13 = (Button)findViewById(R.id.button13);
    button13.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    HttpURLConnection connection = null;
                    BufferedReader reader = null;
                    try{
                        URL url = new URL("http://www.chicai.group");
                        connection = (HttpURLConnection)url.openConnection();
                        connection.setRequestMethod("GET");
                        connection.setConnectTimeout(8000);
                        connection.setReadTimeout(8000);
                        connection.connect();
                        int responseCode = connection.getResponseCode();
                        if(responseCode != HttpURLConnection.HTTP_OK) return;
                        InputStream in = connection.getInputStream();
                        reader = new BufferedReader(new InputStreamReader(in));
                        String line;
                        StringBuilder response = new StringBuilder();
                        while((line = reader.readLine()) != null )
                        {
                            response.append(line);
                        }

                        //这里用Handle通知主线程修改UI
                        Message m = new Message();
                        m.what = UPDATE_TEXT;
                        m.obj = response.toString();
                        handle.sendMessage(m);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                    finally {
                        if(reader != null)
                        {
                            try{
                                reader.close();
                            }catch (IOException e)
                            {
                                e.printStackTrace();
                            }
                        }
                        if(connection != null)
                            connection.disconnect();
                    }
                }
            }).start();
        }
    });
}


异步消息处理机制you4个部分组成:Message、Handler、MessageQueue和Looper。

Message是线程之间传递的消息,他可以在内部携带少量的信息,用于不同线程之间交换数据。使用what字段表示什么、arg1和arg2传递整形数值、obj传递一个对象。

Handler为处理者,主要用来发送和处理消息。发送消息一般是使用Handler的sendMessage()方法,发出的消息经过一系列辗转处理后,最终会传递到Handler的handleMessage()方法。

MessageQueue是消息队列的意思,他用来存放Handler发送的消息,这部分消息会一直存放在消息队列中,等待被处理。每个线程中只会有一个MessageQueue对象。

Looper是每个线程中MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中。每个线程中也只会有一个Looper对象。

图片.png


首页 我的博客
粤ICP备17103704号