[关闭]
@ExcitedSpider 2018-01-05T22:17:48.000000Z 字数 1590 阅读 1004

【Android】Android多线程实现

当一个app启动时,Android系统为这个app启动一个Linux进程(process)。在默认设置中,这个app的所有构件都使用这个进程中的一个线程(thread),称为主线程(main thread)。但是我们知道,app中有很多操作(比如网络io,外部存储io)是很耗时间的,如果把这些操作都放在主线程中,无疑会使app变得卡顿不堪,所以我们需要多线程
未命名文件.png-13.6kB

多线程设计原则

主线程

在安卓sdk官方文档中,对主线程任务的定义是:渲染UI,响应交互事件并分配工作(到其他线程)。所以,主线程又可以称为UI线程。对于主线程,只要阻塞几秒钟,就会出现我们常见的"程序未响应"。所以主线程的流畅工作非常重要,不要在主线程上安排可能会需要大量时间和资源的工作。
同时,应该认识到主线程是自动创建的,和整个进程的生命长度相同。

工作线程

工作线程,负责为主线程减负,承担需要大量时间和资源的工作,当其工作完成时,发送消息通知主线程,主线程接受消息后用工作线程处理好的资源进行工作。实现方法就是java的多线程。

  1. public void onClick(View v) {
  2. new Thread(new Runnable() {
  3. public void run() {
  4. Bitmap b = loadImageFromNetwork("http://example.com/image.png");
  5. }
  6. }).start();
  7. }

下载图片是一个比较耗时的工作,不要让主线程去做,让新的工作线程去做
应该提一点,android的设计师做了这样的设计:只有主线程才能操作UI(主要是为了防止内存泄漏),所以工作线程就不要越俎代庖了(包括发送Toast消息)。

使用Handler、Message和Looper处理多线程时间

android的这个设计是为了降低工作线程很多时的工作复杂度,message用来传递线程结束以及其他重要的消息,可以说是很优雅的设计了。

  1. Bitmap b
  2. Arraylist list;
  3. final Handler handler = new Handler(Looper.myLooper()) //消息处理类Handler
  4. {//在主线程中,调用myLooper()获得主线程自带的Looper,实现循环处理
  5. @override
  6. public void handleMessage(Message msg) {
  7. switch (msg.what) {
  8. case 0: //处理信息为0的工作线程的结束报告
  9. mImageView.setImageBitmap(b);break;
  10. case 1://处理信息为1的工作线程的结束报告
  11. mListView.loadFromList(list);break;
  12. }
  13. }
  14. };
  15. new Thread(new Runnable() {
  16. public void run() {
  17. Message message=new Message();
  18. message.what=0; //本线程记录信息0
  19. b = loadImageFromNetwork("http://example.com/image.png");
  20. handler.sendMessage(message);//发送给主线程,报告自己的工作做完了(下载图片),主线程可以用这张图片去渲染了
  21. }
  22. }).start();
  23. new Thread(new Runnable() {
  24. public void run() {
  25. Message message=new Message();
  26. message.what=1; //本线程记录信息1
  27. readFromDataBase(list,sqLiteOpenHelper);//从数据库中读取信息
  28. handler.sendMessage(message);//发送给主线程,报告自己的工作做完了(读取数据库),主线程可以用这个Arraylist去渲染列表了
  29. }
  30. }).start();
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注