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比较适用于单线程+单一操作的场景,耗时操作不需要循环进行,或者耗时操作比较少,不需要队列

 

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

  send的方式:

 

   

  post的方式:

   

   

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

4、线程池的应用

   new Thread的弊端

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

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

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

       解决使用Handle较为繁琐

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值