一、自定义Toast
①、在layout文件夹下创建自定义的Toast布局文件
Android_自定义Toast、子线程修改UI
②、创建自定义Toast的java文件,继承Toast类
Android_自定义Toast、子线程修改UI
③、编写MyToast代码,如下:
Android_自定义Toast、子线程修改UI
扩:
Android_自定义Toast、子线程修改UI
④、调用
Android_自定义Toast、子线程修改UI

二、子线程修改UI

如下代码:
xml:
Android_自定义Toast、子线程修改UI
java:
Android_自定义Toast、子线程修改UI

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

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

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

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

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

通过handler消息队列机制能够实现进度条,但是
线程:
Android_自定义Toast、子线程修改UI
进度条在子线程直接修改也是能够实现进度,原因在于Android在setProgress方法里已经实现了handler机制

相关文章: