Android开发——消息机制(二)Handler的使用

Hanlder的使用方法

 1. 创建Handler成员变量对象,并重写其handleMessage()方法
 2. 在分/主线程创建Message对象
 3. 使用handler对象发送Message
 4. 主线程,在hanlerMessage()中处理消息

Handler的原理

运行效果图

点击GET Submit1进行普通的同步工作

点击GET Submit2使用Handler进行异步工作

实现代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.administrator.handlerexcise.MainActivity">

    <ProgressBar
        android:id="@+id/pb_handler_loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        android:layout_gravity="center"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="getSubmit1"
        android:text="GET Submit1"
        android:textAllCaps="false" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="getSubmit2"
        android:text="GET Submit2"
        android:textAllCaps="false" />

    <EditText
        android:id="@+id/et_handler_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/et_bg"
        android:hint="显示结果"/>


</LinearLayout>

MainActivity

package com.example.administrator.handlerexcise;

import android.graphics.Path;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @author thinkdoor
 *
 * 测试Handler的基本使用
 1. 创建Handler成员变量对象,并重写其handleMessage()方法
 2. 在分/主线程创建Message对象
 3. 使用handler对象发送Message
 4. 主线程,在hanlerMessage()中处理消息
 */
public class MainActivity extends AppCompatActivity {

    ProgressBar progressBar;
    EditText editText;

    //创建Handler成员变量对象,并重写其handleMessage()方法,匿名内部类
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {        //在主线程执行
            //主线程,在hanlerMessage()中处理消息
            if(msg.what == 1) {
                String result = msg.obj.toString();
                editText.setText(result);
                progressBar.setVisibility(View.INVISIBLE);
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar = (ProgressBar) findViewById(R.id.pb_handler_loading);
        editText = (EditText) findViewById(R.id.et_handler_result);

    }

    /*
     * 不使用Handler实现异步工作
    1.  主线程,显示提示视图ProgressBar
    2.  子线程,联网请求,并得到响应数据
    3.  主线程,显示数据,因此提示视图
     */
    public void getSubmit1(final View view) {
        //1.  主线程,显示提示视图ProgressBar
        progressBar.setVisibility(View.VISIBLE);
        //2.  子线程,联网请求,并得到响应数据
        new Thread() {
            @Override
            public void run() {
                super.run();
                String path = "https://www.baidu.com/";
                //调用requestToString方法,得到服务器响应的字符串
                try {
                    final String request = requestToString(path);

                    //3.  主线程,显示数据
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            editText.setText(request);
                            //隐藏提示视图
                            progressBar.setVisibility(View.INVISIBLE);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }.start();

    }

    /**
     * 使用Handler实现异步工作
     * @param view
     */
    public void getSubmit2(View view) {
        //1).  主线程,显示提示视图ProgressBar
        progressBar.setVisibility(View.VISIBLE);
        //2).  子线程,联网请求,并得到响应数据
        new Thread(){
            @Override
            public void run() {
                String path = "https://www.baidu.com/";
                try {
                    String result = requestToString(path);

                    //2.在分/主线程创建Message对象
                    Message message = Message.obtain();
                    message.what = 1;
                    message.obj = result;

                    //使用handler对象发送Message
                    handler.sendMessage(message);

                } catch (Exception e) {
                    e.printStackTrace();
                }


            }
        }.start();
        //3).  主线程,显示数据,因此提示视图

    }

    /**
     * 请求服务器,得到返回结果字符串
     *
     * @param path:要访问的服务器路径
     * @return String
     * @throws Exception
     */
    public String requestToString(String path) throws Exception {
        //创建流和连接
        InputStream inputStream = null;
        ByteArrayOutputStream baos = null;
        HttpURLConnection connection = null;
        String result = null;
        try {
            //1.获得连接
            URL url = new URL(path);
            connection = (HttpURLConnection) url.openConnection();
            //2.设置配置
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(6000);
            //3.连接
            connection.connect();
            //4.发送请求,响应200进行读取
            int responseCode = connection.getResponseCode();
            if (responseCode == 200) {
                //     得到InputStream,并读取成String
                inputStream = connection.getInputStream();
                baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len = -1;
                while ((len = inputStream.read(buffer)) != -1) {
                    baos.write(buffer, 0, len);
                }
                result = baos.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //7)    关闭流,断开连接
            try {
                baos.close();
                inputStream.close();
                connection.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}

当然还有网络授权

<!--网络权限-->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <application

 

需要打包的项目文件请留言

 

觉得有用的话,点个赞和关注吧,博主会坚持写更实用易懂的博文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狮子座的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值