子线程与主线程通信之Thread-Handler-Message

1.图解Thread-Handler-Message:

这里写图片描述

2.文字说明:
(1)Handler: 主线程申明。
(2)在子线程发消息:handler.sendMessage (message)。
Message: 2个重要的属性:a.what:消息类型。b.obj:消息的具体内容。
(3)在主线程接收消息:handler.handlerMessage (message)。

3.代码展示:以检查软件是否需要更新为例:(1)开辟子线程访问网络:new Thread(){ public void run(){ };} .start(); (2)发消息给handler处理: Handler handler = new Handler(){ handleMessage(Message msg){};};

public class MainActivity extends Activity {

    public static final int MSG_SHOW_DIALOG = 1;
    public static final int MSG_ENTER_HOME = 2;
    public static final int MSG_WEB_ERROR = 3;
    private int webVersionCode;
    private String webAPKUrl;
    private String webVersionDes;

    private Handler handler = new Handler() {
        // 在主线程处理消息
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MSG_SHOW_DIALOG:
                // TODO showDialog()
                break;
            case MSG_ENTER_HOME:
                // TODO enterHome()
                break;
            case MSG_WEB_ERROR:
                // TODO enterHome()
                break;
            default:
                break;
            }

        };

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        checkUpdateAPK();
    }

    private void checkUpdateAPK() {
        // 检查服务端是否有更新,相当于对网络进行访问:开启子线程访问
        new Thread() {
            @Override
            public void run() {
                long startTime = System.currentTimeMillis();
                // 网络访问流程
                Message msg = new Message();
                try {
                    URL url = new URL("http://xxxxxxxx");
                    HttpURLConnection conn = (HttpURLConnection) url
                            .openConnection();
                    conn.setRequestMethod("GET");
                    int code = conn.getResponseCode();
                    if (code == 200) {
                        // 连接服务器成功,则获取输入流,读取网络文件
                        InputStream is = conn.getInputStream();
                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(is));
                        String webResult = reader.readLine();
                        // 对web数据进行解析
                        JSONObject jsonObject = new JSONObject(webResult);
                        webVersionCode = jsonObject.getInt("code");
                        webAPKUrl = jsonObject.getString("apkurl");
                        webVersionDes = jsonObject.getString("des");
                        // 拿到版本号之后,比较服务端和现有的把版本比较,如果web端的版本高于客户端
                        // 则弹出对话框询问是否升级
                        if (webVersionCode > getVersion()) {
                            // 调用对话框询问是是否更新
                            msg.what = MSG_SHOW_DIALOG;
                        } else {
                            // 服务端没有更新的apk,跳转到home界面
                            msg.what = MSG_ENTER_HOME;
                            // enterHome();
                        }
                    } else {
                        // 访问服务端有异常,也直接跳转到home界面
                        // enterHome();
                        msg.what = MSG_WEB_ERROR;
                    }
                } catch (Exception e) {
                    msg.what = MSG_WEB_ERROR;
                    e.printStackTrace();
                } finally {
                    // 访问网络需时间
                    long durationTime = System.currentTimeMillis() - startTime;
                    if (durationTime < 2000) {
                        // 继续休眠
                        SystemClock.sleep(2000 - durationTime);
                    }
                    // 6.向主线程发消息
                    handler.sendMessage(msg);
                }

            };
        }.start();

    }

    private int getVersion() {
        // 获取版本号
        PackageManager packageManager = getPackageManager();
        try {
            PackageInfo packageInfo = packageManager.getPackageInfo(
                    getPackageName(), PackageManager.GET_ACTIVITIES);
            return packageInfo.versionCode;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return 0;
    }
}

4.Thread-Handler-Message不足之处:
(1)每次访问网络,都需要开辟匿名线程,匿名线程不好管理
(2)有可能同时开辟多个子线程,在一个时间段开辟多个线程,会影响性能和体验。
AsyncTask也是子线程与主线程通信的一种方式,它对上述的不足进行了封装处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值