文档章节

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

斯基劳绅士
 斯基劳绅士
发布于 2015/02/08 12:35
字数 547
阅读 35
收藏 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
兰州
程序员
私信 提问
Android 进阶学习笔记整理

一.android系统架构图及各层介绍 1. 应用层:应用是用java语言编写的运行在虚拟机上的程序,比如通讯录,日历,电话,短信,浏览器等。 2. 应用框架层:这一层是编写Google发布的核心应用时所...

FunCode
2018/07/22
0
0
一份关于 Java、Kotlin 与 Android 的学习笔记

JavaKotlinAndroidLearn 这是一份关于 Java 、Kotlin 、Android 的学习笔记,既包含对基础知识点的介绍,也包含对一些重要知识点的源码解析,笔记的大纲如下所示: Java 重拾Java(0)-基础知...

叶应是叶
2018/08/08
0
0
Android adt bundle 开发环境配置及第一个“Hello world”程序运行

最近在学习Android 顺便记录下学习过程当作复习吧,这是写的第一篇正式博客。 一、jdk环境配置 二、android adt bundle 下载 三、安装SDK 四、模拟器及真机调试 五、第一个程序 Hello world!...

程序猿付显
2014/07/23
19.9K
0
这是一份全面 & 详细的Android多线程知识总结指南

前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 今天,我将献上一份全面 & 详细的Android多线程学习指南,希望你们喜欢。 目录 1. 多线程基础知识 在了解Android多线程实现...

Carson_Ho
06/26
0
0
Android telephony MMS 学习笔记

本文主要从以下几个方面来学习MMS在android系统中的处理:MMS初始化、MMS发送、MMS接收(包括push MMS接收和从MMSC中提取MMS内容)、MMS存储/删除等数据操作。 Android MMS基本知识点 一、M...

亭子happy
2013/01/20
399
0

没有更多内容

加载失败,请刷新页面

加载更多

程序设计基础(C)第06讲例程

1summing.c /* summing.c -- 根据用户键入的整数求和 */#include <stdio.h>int main(void){ long num; long sum = 0L; /* 把sum 初始化为0 */ int status; p......

树人大学数字媒体吴凡
26分钟前
6
0
聊聊nacos config的publishConfig

序 本文主要研究一下nacos config的publishConfig ConfigController nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/controller/ConfigController.java @Controller@R......

go4it
54分钟前
5
0
Eureka应用注册与集群数据同步源码解析

在之前的EurekaClient自动装配及启动流程解析一文中我们提到过,在构造DiscoveryClient类时,会把自身注册到服务端,本文就来分析一下这个注册流程 客户端发起注册 boolean register() t...

Java学习录
今天
11
0
Java描述设计模式(15):责任链模式

本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景描述 1、请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批当 3<day<=5 天,部门经理审批当 day>5 天...

知了一笑
今天
11
0
总结:数组与链表

1、内存申请:数组在内存上是连续的空间;链表,内存地址上可以是不连续的。 2、查询速度:数组可以随机访问,链表必须顺序访问,即从首个元素开始遍历,逐个查找,所以数组查询很快。 3、写入...

浮躁的码农
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部