handler的使用(Android中Handler的主要作用是什么通俗点,初学)

本文目录
Android中Handler的主要作用是什么通俗点,初学
Handler的使用主要是android中无法在主线程(即UI线程)中访问网络、无法在子线程中访问UI线程元素。
一般是在子线程中访问网络,然后使用Handler发送message通知主线程处理UI更新操作
Android用handler在线程间传值
想要让Activity收到消息,就要使用它自己的handler。
你可以在activity中声明一个静态的handler,在onCreat方法中初始化。
然后再其他线程直接调用。
还有就是,你应该把activity的handler赋值给Thread的
不知道为什么百度抽了,没有办法追问,关于你的程序,我试调一下,消息传递没有问题,吧前面的网页访问注释掉直接向Activity发送消息,已经收到,请检查你代码的其他部分
Android 为什么使用Handler
在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化。有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容。
我们假设在一个UI界面上面,有一个按钮,当点击这个按钮的时候,会进行网络连接,并把网络上的一个字符串拿下来显示到界面上的一个 TextView上面,这时就出现了一个问题,如果这个网络连接的延迟过大,可能是10秒钟甚至更长,那我们的界面将处于一直假死状态,而如果这段时间超 过5秒钟的话,程序会出现异常。
这时我们会想到使用线程来完成以上工作,即当按钮被按下的时候新开启一个线程来完成网络连接工作,并把得到的结果更新到UI上面。但是,这时候又会 出现另一个问题,在Android中,主线程是非线程安全的,也就是说UI的更新只能在本线程中完成,其他线程无法直接对主线程进行操作。
为了解决以上问题,Android设计了Handler机制,由Handler来负责与子线程进行通讯,从而让子线程与主线程之间建立起协作的桥梁,使Android的UI更新的问题得到完美的解决。接下来举例来诠释Handler的基本使用方法。
Handler的工作原理
一般情况下,在主线程中我们绑定了Handler,并在事件触发上面创建新的线程用于完成某些耗时的操作,当子线程中的工作完成之后,会对Handler发送一个完成的信号,而Handler接收到信号后,就进行主UI界面的更新操作。
2
Handler与子线程协作实例
1、创建Handler实现类,在主UI所在类中的内部类
class MyHandler extends Handler {
public MyHandler() { }
public MyHandler(Looper L) {
super(L);
}
// 重写handleMessage方法,接受数据并更新UI
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//此处根据msg内容进行UI操作
}
}
2、子线程的实现
class MyThread implements Runnable {
public void run() {
Message msg = new Message();
Bundle b = new Bundle();
b.putString("cmd", "update");
msg.setData(b);
MainActivity.this.myHandler.sendMessage(msg);
//通知Handler更新UI
}
}
通过以上的两个实现,我们只需要在MainActivity中声明MyHandler实例对象就可以完成线程之间的通讯和界面的更新操作。
MyHandler myHandler = newMyHandler();
为什么使用Handler需要Looper
因为在Handler的构造函数里面,mLooper=Looper.myLooper();如果mLooper==null的话,就会抛出“can’t create handler inside thread that has not called Looper.prepare()”异常。为什么需要Looper呢?因为Looper的作用是不断的从MessageQueue中通过queue.next()方法取出消息,然后交给Handler处理,而Looper在构造函数中new了一个MessageQueue,并保存了当前线程对象,如果不构造Looper的话,就不会有MessageQueue,所以后面的取出消息就谈不上了,所以使用Handler需要Looper。

本文相关文章:
buffer java(Java SE用NIO(New IO)里面的Buffer类有什么好处适合在什么场合使用)
2026年10月11日 12:40
nodename(QTA nodename nor servname provided, or not known问题解决)
2026年10月5日 11:50
推荐8款im即时通讯开源的(flutter即时通讯sdk哪家做得比较好)
2026年10月4日 11:00
repository注解与mapper(SpringBoot中的Mapper注解和Repository注解)
2026年9月30日 02:40
inner join用法on后面多个条件(inner join的条件不可以用不等于吗)
2026年9月26日 16:50
html网页设计特效(Dreamweaver网页制作如何在设计界面制作鼠标特效)
2026年9月23日 22:30
oracle如何登录(如何以管理员的身份登录oracle 与SqlServer)
2026年9月10日 11:00
period的用法(的用法有没人告诉小弟一下period这个单词怎么用)
2026年9月8日 18:20
perseverance的意思(preseverance的意思)
2026年9月6日 18:30
请简要说明servlet的工作原理(servlet是什么及工作原理)
2026年9月6日 07:10
更多文章:
handler的使用(Android中Handler的主要作用是什么通俗点,初学)
2026年10月13日 07:50
python list方法(python中List添加、删除元素的几种方法)
2026年10月13日 04:40
sql触发器的主要作用是什么(sql server 触发器有什么用)
2026年10月13日 03:30
java培训机构安排就业吗(java课程培训机构分享计算机专业毕业学Java好就业吗)
2026年10月13日 01:50
apache服务器的配置(在apache的配置文件中,什么用于加载文件)
2026年10月13日 00:10
docker zookeeper(Mac 使用 docker 搭建 kafka 集群 + Zookeeper + kafka-manager)
2026年10月12日 23:40
linuxfind目录名(linux find 怎样取得文件名呢)
2026年10月12日 21:00
