Android——多线程(Handler机制)

Android的多线程技术,大致分两种:Handler机制和AsyncTask封装。

在这里要提到一点,在Mainactivity中运行的是属于UI线程,

1.UI线程运行界面 里面不能放耗时操作(耗时操作要放在子线程)

2.子线程无法访问UI线程 只有UI线程能访问 界面

耗时操作,顾名思义需要通过时间才能达到的效果的操作。

先来说Handler,来看张图:

这里写图片描述

在这里,Handler通过子线程发送消息,将一个个消息放入消息队列当中,通过Looper

循环取出队列中的消息(先进先出),将消息又发送到UI主线程,通过handlemessage

方法来对传过来的消息进行更新UI操作。

一般handlemessage方法直接在定义Handler的时候创建在属性内。

废话不多说,直接上手,用Handler来实现一个倒计时的功能。

这里写图片描述

中间放着是一个TextView,通过Handler发消息来修改它的值。

mainactivity:

package com.example.handlertest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity {
    private TextView tv;
    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {

            if(msg.what==10)
            {
            tv.setText(msg.arg1 + "");
            }

        }
    };

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

        tv = (TextView) findViewById(R.id.tv);

        new Thread() {
            public void run() {

                for (int i = 10; i >= 1; i--) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Message msg = Message.obtain();
                    msg.arg1 = i;
                    msg.what=10;
                    handler.sendMessage(msg);

                }

            }

        }.start();
    }

}

大致分三步:创建Handler对象、发消息、接消息。

1、在属性中定义Handler并且创建它的对象,并且调用该类的handleMessage方法,

用于更新UI。

2、在这里sendmessage需要创建Message对象,有没有考虑一个问题,如果消息很

多,都要存放消息队列岂不是要很占内存,所有它也有自己的回收机制,

Message.obtain(),出去一个消息,将新的消息进入对列,并不用存放所有消息,走一

个来一个,好比ListView的刷新新的item一样。

msg(Message对象)可以携带数据,msg.arg1(arg2)携带int数据,如果有其他数据

类型需要携带,msg.obj就可以了。

发消息也需要自己的标识,不然那么多消息该怎样匹对呢。msg.what=?,这个相当于给

本次msg一个id,只不过这个id是int值。

3、消息发过去之后,会再handlermessage方法中接收到该消息,通过传过来的msg来

对UI进行更新操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值