Android多线程和异步任务

1、Android开发中使用多线程的原因

  • 避免ANR(Application is not responding)
  • 实现异步,比如从云端获取图片比较费时,不应该使用同步阻塞获取结果,使用异步加载完成一个刷新一个

       (这种要用到线程池?)

  • 多任务,比如多线程下载

2、同步和异步的理解

有些事件必须使用同步比如用户的注册,需要得到结果后才能进行下面的操作,有些事件需要异步,比如微博的点赞,只需要点赞完成后提示我一下就行了,没必要在与服务器沟通的过程中采用同步处理不可以干其他的事情。

3、线程间通信

     需要处理耗时操作,可以新建一个子工作线程HandlerThread,也可以直接通过new Thread创建一个新的子线程

  •     新建一个子工作线程HandlerThread

     HandlerThread handlerThread = new HandlerThread("Handler Thread");

     handlerThread.start();

     Handler workderHandler = new Handler(handlerThread.getLooper(), new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                //运行在工作线程(子线程)中,用于实现自己的消息处理
                return true;
            }
        });

       

  HandlerThread应用场景   

   HandlerThread比较适用于单线程+异步队列的场景,比如IO读写操作数据库、文件等,耗时不多而且也不会产生较大的阻         塞。对于网络IO操作,HandlerThread并不适合,因为它只有一个线程,还得排队一个一个等着

    这里单线程+异步队列模型的使用场景还举几个例子: 
   1. 应用刚启动时的数据初始化操作,如果开启多个线程同时执行,有可能争夺UI线程的CPU执行时间,造成卡顿,而使用该模        型,通过设置优先级就可以将同步工作顺序的执行,而又不影响UI的初始化;

    2.从数据库中读取数据展现在ListView中,通过Handler的postAtFrontOfQueue方法,快速将读取操作加入队列前端执行,必          要 时返回给主线程更新UI;

    3.HandlerThread应用在IntentService中,IntentService是一个需要长时间执行任务Service,优先级要比线程高。
 

  •     直接通过new Thread创建一个新的子线程

           new Thread(new Runnable() {

                   public void run(){

                            xxxx; //做耗时操作 

                    }

            }).start();

    new Thread应用场景(个人认为)

     HandlerThread比较适用于单线程+单一操作的场景,耗时操作不需要循环进行,或者耗时操作比较少,不需要队列

 Android多线程和异步任务_第1张图片

  •   post和send的区别:(这里还是不太好理解,两者用法有什么区别?以后再继续看源码...)

  send的方式:

  Android多线程和异步任务_第2张图片

   Android多线程和异步任务_第3张图片

  post的方式:

   

   Android多线程和异步任务_第4张图片

​​​​​​​        参考文章:https://www.jianshu.com/p/43d6cd7b06f1

4、线程池的应用

   new Thread的弊端

  • 性能差
  • 缺乏统一管理,无序竞争
  • 无法定时定期执行

     线程池的问题单独开一篇文章来学习...

5、AsyncTask类(可以在子线程和UI线程中跳转)

       解决使用Handle较为繁琐

      AsyncTask优点:简单,快捷
      缺点:当有多个异步操作时并需要变更ui复杂

      这个以后再详细了解...

你可能感兴趣的:(Java,Android)