多线程(消息处理机制)

  • 当主线程执行的操作时间过长,就无法执行其他操作。消息队列中的消息无法处理,UI界面就不会更新,用户事件也不会处理。
  • 如果主线程执行一个操作超过5秒,Android可能会弹出一个应用程序没有响应的对话框,你的Activity可能会被杀掉

Ul线程中的操作要尽量短小,费时的操作(如网络连接,数据库访问)等要在单独的线程中完成。如果Ul线程超过5s没有响应用户请求,会弹出ANR的对话框。常见的耗时操作如下:

  • 网络连接和网络数据的获取
  • 对存储器的读写
  • 大量的数据计算

消息队列MessageQueue:

  • Android采用种复杂的Message Queue机制保证线程间通信。
  • Message Queue是一个消息队列,用来存放通过Handler发布的消息。Android在第一次启动程序时会默认为UI线程创建一个关联的消息队列,用来管理程序的组件,如Activity,Service ,Broatcast Receiver等。
  • 可以在工作线程中创建Handler与U线程通信。

  • 工作线程可以通过Handler对象和主线程通讯,Handler对象的所有工作将在主线程中执行
  • Handler类需要实现handleMessage()方法,来处理消息队列中取出的Message对象。
  • handleMessage ()方法由主线程调用,可以在需要的时候更新UI界面。但是,必须确保此方法快速完成,因为其他UI操作会等待它完成才能执行。
  • 可以在Message中附加不同的参数

eg:

MainActivity中:

switch (view . getId()) {
    case R. id. btnAsync:
    //使用线程完成
    //工作线程是一个匠名类
    new Thread() {
I
        public void run() {|
            for (int i=0;i<100;i++) {
                //tvTest. setText (+"") ;//不允许,子线程不可更新UI线程中控件的属性
                Message msg = new Message () ;
                msg.what=0x0001; //消息的what是消息标识,必须有
                msg.arg1=i;
                handler.sendMessage (msg) ;
                try {
                    Thread.sleep (1000) ;
                } catch (InterruptedException e) {
                    e .printstackTrace() ;
                }
            }
     };
}
private TextView tvTest;
private Handler handler = new Handler() {
    public void handleMessage (android. os .Message msg) {
        //处理消息,运行在主线程中
        switch (msg.what) {
            case 0x0001:
            int index-msg.arg1 ;
            tvTest. setText (index+"") ;//允许,因为运行在主线程中
            break ;
        }
    };
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hnu哈哈

请接受直女的么么哒????

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

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

打赏作者

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

抵扣说明:

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

余额充值