Android Handler與Thread

0x0 前言

在上一篇文章中,Android 線程之Thread 中,我們發現單純使用Thread類,更新UI時,都要創建新的Runable對象,對於資源是一種浪費。在本篇中,我們將Thread與Handler聯合起來使用,避免資源浪費。

0x1 概述

A Handler allows you to send and process Message and Runnable objects
associated with a thread’s MessageQueue.

0x3 演示

怎麼使用Handler呢,以一個賬戶登錄demo爲例子,截取部分代碼:
在我們的activity中,Handler類推薦用法

private static class IHandler
            extends Handler {
        private final WeakReference<Activity> mActivity;

        public IHandler(MainActivity activity) {
            mActivity = new WeakReference<Activity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
//            super.handleMessage(msg);
            if (dialog != null) {
                dialog.dismiss();
            }
            int flag = msg.what;
            switch (flag) {
                case 0:
                    String errorMsg = msg.getData().getSerializable("ErrorMsg").toString();
                    ((MainActivity) mActivity.get()).showTips(errorMsg);
                    break;
                case FLAG_LOGIN_SUCCESS:
                    ((MainActivity) mActivity.get()).showTips(MSG_LOGIN_SUCCESS);
                    break;
                default:
                    break;

            }

        }
    }

    private IHandler handler = new IHandler(this);

登錄線程

 //登陸線程
                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            user.userLogin(MainActivity.this, userName, password);
                            handler.sendEmptyMessage(FLAG_LOGIN_SUCCESS);
                        } catch (ConnectException e) {
                            Message message = new Message();
                            Bundle data = new Bundle();
                            data.putSerializable("ErrorMsg", "無法確立連接");
                            message.setData(data);
                            handler.sendMessage(message);
                        } catch (ConnectTimeoutException e) {
                            Message message = new Message();
                            Bundle data = new Bundle();
                            data.putSerializable("ErrorMsg", "連接超時");
                            message.setData(data);
                            handler.sendMessage(message);
                        } catch (SocketTimeoutException e) {
                            Message message = new Message();
                            Bundle data = new Bundle();
                            data.putSerializable("ErrorMsg", "SocketTimeoutException連接超時");
                            message.setData(data);
                            handler.sendMessage(message);
                        } catch (ServiceRulesException e) {
                            Message message = new Message();
                            Bundle data = new Bundle();
                            data.putSerializable("ErrorMsg", e.getMessage());
                            message.setData(data);
                            handler.sendMessage(message);
                        } catch (Exception e) {
                            e.printStackTrace();

                            Message message = new Message();
                            Bundle data = new Bundle();
                            data.putSerializable("ErrorMsg", MSG_LOGIN_ERROR);
                            message.setData(data);
                            handler.sendMessage(message);
                        }

                    }
                });
                thread.start();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章