Handler的用法介绍

1.handler主要用于子线程与主线程的消息传递,由于UI线程不能执行耗时操作,所以我将耗时操作放到子线程中去执行,并同Handler机制将子线程获取的消息发送到UI线程中,从而实现UI的线程中控件的内容的实时更新。

2.一般都是子线程向主线程发送消息,那如何实现主线程向子线程发送消息呢?其实我们可以通过下面实例来实现:

public class MainActivity extends AppCompatActivity implements Runnable {

    public static final int CODE_RESULT_TEXT = 100000;

    public static final int CODE_SEND_MESSAGE = 998;

    public static final int CODE_RECEIVE_MESSAGE = 999;

    // 聊天线程
    private Thread mChatThread;

    // 发送Handler,将主线程的消息发送给子线程
    private Handler mChatHandler;

    private EditText mTextMessage;

    //private ArrayAdapter<String> mAdapter;

    //private List<String> mMessages;

    private List<ChatMessage> mMessages;

    private ChatAdapter mAdapter;

    private ListView mListView;
    //接收子线程发送的消息
    private Handler mReceiveHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case CODE_RECEIVE_MESSAGE:
                    int type = msg.arg1;
                    if (type == CODE_RESULT_TEXT) {
                        String text = (String) msg.obj;

                        ChatMessage message = new ChatMessage();
                        message.setReceived(true);
                        message.setTime(System.currentTimeMillis());
                        message.setText(text);
                        message.setUserName("机器人");
                        mMessages.add(message);

                        mAdapter.notifyDataSetChanged();

                        int count = mAdapter.getCount();
                        mListView.setSelection(count - 1);

                    }
                    break;
            }
        }
    };

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

        mTextMessage = (EditText) findViewById(R.id.txt_message);

        mMessages = new ArrayList<>();
        mAdapter = new ChatAdapter(this, mMessages);

        mListView = (ListView) findViewById(R.id.chat_message_list);
        if (mListView != null) {
            mListView.setAdapter(mAdapter);
        }

        mChatThread = new Thread(this);
        mChatThread.start();
    }
    //按钮点击事件
    public void btnSend(View view) {
        if (mChatHandler != null) {

            //将主线程的消息发送给子线程
            Message message = mChatHandler.obtainMessage(CODE_SEND_MESSAGE);
            String text = mTextMessage.getText().toString();
            message.obj = text;
            mChatHandler.sendMessage(message);

            ChatMessage chatMessage = new ChatMessage();
            chatMessage.setReceived(false);
            chatMessage.setText(text);
            chatMessage.setTime(System.currentTimeMillis());
            chatMessage.setUserName("我");

            mMessages.add(chatMessage);

            mAdapter.notifyDataSetChanged();

            int count = mAdapter.getCount();
            //设置ListView控件每增加一个item就自动滚动到底部
            mListView.setSelection(count - 1);
        }
    }

    @Override
    public void run() {
        Looper.prepare();

        Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case CODE_SEND_MESSAGE:
                        // 发送数据
                        JSONObject object = new JSONObject();
                        try {
                            object.put("key", "67fef75d8c0924ca1ef377eaa40aa838");
                            object.put("info", msg.obj.toString());
                            object.put("loc", "北京市海淀区");
                            object.put("userid", Build.SERIAL);
                            byte[] data = HttpUtil.doPostJson("http://www.tuling123.com/openapi/api", object.toString());//使用网络请求的POST请求方式


                            if (data != null) {
                                String jsonString = new String(data, "UTF-8");
                                Log.d("ChatThread", "json string = " + jsonString);
                                JSONObject jsonObject = new JSONObject(jsonString);
                                int code = jsonObject.getInt("code");
                                if (code == CODE_RESULT_TEXT) {
                                    String text = jsonObject.getString("text");
                                    Message message = mReceiveHandler.obtainMessage(CODE_RECEIVE_MESSAGE);
                                    message.obj = text;
                                    message.arg1 = code;
                                    mReceiveHandler.sendMessage(message);
                                }
                            }

                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                        break;
                }
            }
        };
<span style="white-space:pre">	</span>//通过方式将主线程Handler对象指向子线程的Handler,并将子线程的Handler实例化一个对象,从而获取主线程发送来的消息<span style="white-space:pre">	</span>
        mChatHandler = handler;

        Looper.loop();
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值