2018-08-01 Handler AsyncTask
如果我们要在主线程中完成耗时工作那么肯定会柱堵塞主线程,那么用户体验就会很差,因此我们需要使用子线程。但是如果在子线程中更新UI组件那么就会出现异常,原因很简单,android 的 UI 也会线程不安全。下面介绍使用 handler 更新UI
定义内部类Hadler方法时,要重写方法 handlerMessage(),可以在其中定义线程。
下面介稍 hander 的内部原理。
首先说明 为什么用 handler.obtainMessage ,不用 new 因为 Hendler有一个消息池,用于存储messge 可以反复使用,每个线程只有一个 MessageQueue与 Handler绑定。
上面是使用 Handler 更新UI的基本方法,但是细心的你会发现其中定义的内部类Hanlder代码是黄色Waring 警告的,这是为什么呢? 因为这样写存在内存泄漏问题,因为内部类依赖外部类,当外部类退出,而这个静态内部类依然在运行,那么外部类依然占用内存,并且不能访问数据,这就是内存泄露问题。解决饭方法很简单,使用静态内部类就行了,并且使用弱引用,弱引用就是当内存不够时,系统就会回收内存,使用如下。
接下来介绍使用 Handler 来设置闪屏页。首先找一张图片,放在 mipmap 中,当然你需要根据图片大小来选择几个x的,如果选择不当会报错 。当然,启动页是没有 ActionBar的,所以需要进行设置,继承Activity 而不是 AppCompatActivity,然后在清单文件中设置主题。当然也可是其他没有ActionBar 的。
然后进行布局设置,这里直接使用ImageView 并直接添加图片。
然后在闪屏页的主页进行设置,这里没有使用标准的写法,原因是这里的内部类并不耗时。然后别忘记了 finish() 否则按回退键会返回到 商品页 这样用户体验就会极差。
以上是使用 线程加Handler 来实现异步任务,接下来介绍是使用AsyncTask 这是系统封装好的使用异步任务。具体 参数 四个方法 如下
具体实现如下
具体思想就是上面这样,但是可以分情况选项使用那个方法。