Android中的消息机制

1. 消息机制的引入
     1. 现在有的问题:
          只有在UIThread中才能直接更新界面
          很多长时间处理数据的工作(联网)都需要在workerThread中执行, 完成后立即去更新界面
     2). 解决线程间通信的问题: 消息机制
          Handler+Message 
          Handler+Message +Thread----->AsyncTask

2. Message的使用
     Message msg = Message.obtain();//可以利用缓存的message
     msg = Message.obtain(handler, callback);
     msg.what = 2;//标识
     msg.arg1 = 3; //保存int类型的数据
     msg.arg2 = 4;
     msg.obj = 对象; //保存对象类型的数据
     msg.sendToTarget(); //发送消息给目标handler

3. Handler的使用
     1). 发送消息
          a. 即时的
          b. 延时
          c. 发空消息
          d. 发带数据的消息
         
          ac: sendEmptyMessage(what)
          ad: sendMessage(message)
          bc: sendEmptyMessageDelayed(what, delayTime)
          bd: sendMessageDelayed(message, delayTime)
         
     2). 处理消息
          //消息的分发处理逻辑(源码)
          public void dispatchMessage(Message msg) {   //消息分发处理的流程

               if (msg.callback != null) {
                   handleCallback(msg);//1. 调用msg中的监听回调, 如果执行直接结束
               } else {
                   if (mCallback != null) {
                         if (mCallback.handleMessage(msg)) { //2. 调用Handler中的监听回调, 如果返回true结束了
                             return;
                         }
                   }
                   handleMessage(msg); //3. 调用Handler回调方法
               }
          }
          //定义处理消息的Handler
          private Handler handler = new Handler(new Handler.Callback() {
               @Override
               public boolean handleMessage(Message msg) {//如果message中指定了callback就不会调用
                    Log.e("TAG", " handler callback");
                    //return false;
                    return true;
               }
          }){
               public void handleMessage(android.os.Message msg) {//如果handler callback返回true就不会调用
                    Log.e("TAG", " handler handleMessage()");
               }
          };
    
     3. 移除消息(未处理的)
          handler.removeMessage(what)
4. 消息机制的原理
   

5. AsyncTask的使用
    1). 理解:  
          封装了Handler+Thread(内部用的是线程池)
          简化Handler处理多线程间通信的问题
     2). 使用
     AsyncTask<Params, Progress, Result>() 创建异步任务对象
          Params 启动任务执行的输入参数,比如HTTP请求的URL。
          Progress 后台任务执行的百分比。
          Result 后台执行任务最终返回的结果,比如String。
     execute(Params... params) :
          启动任务, 开始任务的执行流程
     void onPreExecute() :
          在分线程工作开始之前在UIThread中执行,一般用来显示提示视图
     Result doInBackground(Params... params) :
          在workerThread中执行, 完成任务的主要工作,通常需要较长的时间
     void onPostExecute(Result result)   
          在doInBackground()执行完后在UIThread中执行,一般用来更新界面
     publishProgress(Progress... values) : 在分线程中, 发布当前进度
     void onProgressUpdate(Progress... values) : 在主线程中更新进度 

6. AsyncTask的基本原理
   

7. Json数据格式和解析
     1). 格式: 
           json数组: []
               数组中只能放一个一个的value, 它们是有序的
               [value1, value2, value3]
          json对象: {}
               对象中只能放成对(key:value)的数据, 它们是无序的
               [key1:value1, key2:value2, key3:value3]
          key的数据类型:
               字符串
          value的数据类型:
               基本类型: int/float/boolean/...
               字符串
               null
               []
               {}
      2). 解析
         使用Gson框架解析
         1>. 特点:
               字符串转对象时自动化, 不需要手动解析, 但前提是类的属性名要与{}中的Key一致
              效率比较高, 解析快
         2. 将java对象转换为json格式的字符串(服务器执行)
              String json = new Gson().toJson(object);
         3. 将json格式的字符串转换为java对象(客户端执行)
              T t = new Gson().fromJson(json, new TypeToken<T>(){}.getType());  //T可能是List/Map/其它对象

8. 图片的三级缓存技术
      1). 什么是三级缓存?
          一级: 内存中的缓存图片对象, 用Map<url, Bitmap>
          二级: 手机sd卡的files或手机内部的files中缓存图片文件
          三级: 服务器端保存图片文件
      2). 如何应用三级缓存?
          例如:  如何根据url根据图片显示?
           1). 根据url从一级缓存(Map<url, Bitmap>)中取图片对象, 如果取到了, 直接显示
               2). 如果没有, 根据url中包含图片名称(文件名), 手机的sd卡或内部找对就图片文件加载成bitmap
                    如果找到了, 显示并保存到一级缓存
               3). 如果没有, 显示一个默认的图片, 根据url联网请求获取bitmap
                    如果没有, 显示一张代表错误的图片
                    如果有:
                         1). 保存到一级缓存
                         2). 保存到二级缓存
                         3). 显示图片
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值