Android_自定义Toast、子线程修改UI

来源:互联网 发布:wps for mac 编辑:程序博客网 时间:2024/06/06 20:02

一、自定义Toast
①、在layout文件夹下创建自定义的Toast布局文件
这里写图片描述
②、创建自定义Toast的java文件,继承Toast类
这里写图片描述
③、编写MyToast代码,如下:
这里写图片描述
扩:
这里写图片描述
④、调用
这里写图片描述

二、子线程修改UI

如下代码:
xml:
这里写图片描述
java:
这里写图片描述

这里写图片描述

运行报错:
Only the original thread that created a view hierarchy
can touch its views

1、在‘课下Android–>线程UI阻塞及优化’中提到:

这里写图片描述
这里写图片描述
2、why?
这里写图片描述

3、how?
既要保证效率又得保证安全,采取折中的操作——->handler消息队列机制
在UI线程中创建handler,当子线程要修改UI时,通过handler给UI线程发消息,说明我要修改UI,并把要修改的值一并发送给UI,UI中的handler接收到后可进行修改。
代码如下:
①、UI线程(主线程)创建handler
这里写图片描述
②、在子线程中通过handler发送消息
这里写图片描述
③、接收(在之前声明handler的代码中采用匿名对象的方式)
这里写图片描述
4、优化
在3.②中每次循环都会new一个Message对象,会产生大量垃圾
优化:
这里写图片描述
5、扩展—->进度条显示
xml:
这里写图片描述
java:
线程:
这里写图片描述
与上例相同
匿名内部类:
这里写图片描述

通过handler消息队列机制能够实现进度条,但是
线程:
这里写图片描述
进度条在子线程直接修改也是能够实现进度,原因在于Android在setProgress方法里已经实现了handler机制