文档章节

我的Android应用学习笔记(四)Handler相关

斯基劳绅士
 斯基劳绅士
发布于 2015/02/08 12:35
字数 547
阅读 37
收藏 1

「深度学习福利」大神带你进阶工程师,立即查看>>>

Android只允许UI线程修改UI组件(防止线程冲突)

Handler消息传递机制:解决多线程下其他线程改变界面属性问题

Handler在新线程中发送消息,并在UI线程中接受消息

UI线程主要包括如下:

Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc

AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc

Mainthread handler: handleMessage(), post*(runnable r), etc


几个重要的方法:

handleMessage(Message msg):用于接受Message以及在主线程中采取相对应的操作

sendEmptyMessage(int what)发送空消息

sendEmptyMessageDelayed(int what,long delayMillis)延迟delayMillis毫秒后发送空消息

sendMessage(Message msg):发送消息

sendMessageDelayed(Message msg,long delayMillis)延迟delayMillis毫秒后发送消息

例子:

public class SecondActivity extends Activity{

    TextView testTextView;
    private int flag=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        testTextView=(TextView)findViewById(R.id.test_text_view);
        final Handler mHandler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                if (msg.what==0x1111){
                    flag++;
                    testTextView.setText(String.valueOf(flag));
                }
            }
        };

        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                mHandler.sendEmptyMessage(0x1111);
            }
        },0,1000);
    }
}
Message:消息对象

Looper:每个线程只允许有一个Looper,负责读取MessageQueue中的消息

MessageQueue:消息队列

Hansler:用于发送和处理消息,其中Message必须送到MessageQueue中,所以当前线程应该要有一

Looper,UI线程中已经自动

初始化好了Looper对象,无需处理;子线程中需要通过Looper的prepare方法创建一个Looper对象,用Loope

的loop()方法启动Looper

不应将费时运算放于UI线程处理,因为可能造成应用无响应:

Android应用无响应判断机制:

按键或者触摸事件在5秒内无响应或者BroadcastReceiver在10秒内无法处理完成或者Service在20秒内无法处理

完成均判断为应用无响应


在非UI线程中创建Handler模拟耗时操作的例子:


public class ThirdActivity extends Activity {


    Button threadTest;
    HandlerThread handlerThread;

    class HandlerThread extends Thread{
        public Handler mHandler;

        @Override
        public void run() {
            Looper.prepare();
            mHandler=new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    if (msg.what==0x111){
                        try {
                            HandlerThread.sleep(5000);
                        }catch (Exception e){}
                        Toast.makeText(ThirdActivity.this,"耗时Thread处理完成!",Toast.LENGTH_LONG).show();
                    }
                }
            };
            Looper.loop();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
        threadTest=(Button)findViewById(R.id.thread_test);
        handlerThread=new HandlerThread();
        handlerThread.start();
        threadTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Message message=new Message();
                message.what=0x111;
                Bundle bundle=new Bundle();
                bundle.putInt("key",message.what);
                message.setData(bundle);
                handlerThread.mHandler.sendMessage(message);
            }
        });
    }
}



斯基劳绅士
粉丝 9
博文 11
码字总数 13905
作品 0
兰州
程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
708
1
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.5K
16
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22

没有更多内容

加载失败,请刷新页面

加载更多

大数据研发学习之路--Hadoop集群搭建

阅读编译文档 准备一个hadoop源码包,我选择的hadoop版本是:hadoop-2.7.7-src.tar.gz,在hadoop-2.7.7的源码 包的根目录下有一个文档叫做BUILDING.txt,这其中说明了编译hadoop所需要的一些...

DSJ-shitou
今天
8
0
OSChina 周五乱弹 —— 特么是别的公司派来的特洛伊木马吧?

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑推荐:《我会守在这里》- 毛不易 《我会守在这里》- 毛不易 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :股市连跪了五天,...

小小编辑
今天
59
2
如何在find中排除目录。命令 - How to exclude a directory in find . command

问题: I'm trying to run a find command for all JavaScript files, but how do I exclude a specific directory? 我正在尝试为所有JavaScript文件运行find命令,但是如何排除特定目录? ......

法国红酒甜
今天
77
0
《Java8实战》笔记(02):通过行为参数传递代码

本文源码 应对不断变化的需求 通过筛选苹果阐述通过行为参数传递代码 初试牛刀:筛选绿苹果 public static List<Apple> filterGreenApples(List<Apple> inventory){List<Apple> result = ......

巨輪
今天
19
0
JeeSite 4 架构特点、安全方面、为什么好、工匠精神、不忘初心

1、底层架构 以 Spring Boot 2 为基础,Maven 多项目依赖,模块分项目,松耦合,方便模块升级、增减模块。 模块化的数据库自动升级程序,当模块升级代码需要更新数据库时,自动执行对应版本 ...

ThinkGem
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部