Board logo

标题: Picasso使用简介及分析(7) [打印本页]

作者: look_w    时间: 2019-2-18 19:56     标题: Picasso使用简介及分析(7)

8. 重点:bitmap的获取(包括获取途径(内存,硬盘,网络)的判断以及加载)

    Bitmap hunt() throws IOException {   
      Bitmap bitmap = null;   
      //是否从内存读取   
      if (shouldReadFromMemoryCache(memoryPolicy)) {      
        bitmap = cache.get(key);      
        if (bitmap != null) {
          //发送一个内存缓存中查找成功的消息      
          stats.dispatchCacheHit();        
          loadedFrom = MEMORY;
          ...
          return bitmap;      
          }   
        }   
      //NO_CACHE:跳过检查硬盘缓存,强制从网络获取
      //NO_STORE:不存储到本地硬盘
      //OFFLINE:只从本地硬盘获取,不走网络
     
      //如果重试次数为0则走本地硬盘,否则从网络获取
      data.networkPolicy = retryCount == 0 ? NetworkPolicy.OFFLINE.index : networkPolicy;   
      //根据重试的次数和不同的requestHandler的子类来实现不同来源图片的加载,资源文件,硬盘图片又或者网络图片
      //硬盘及网络资源的加载逻辑,具体实现在下面
      RequestHandler.Result result = requestHandler.load(data, networkPolicy);   
      if (result != null) {      
        //加载途径(硬盘,内存,网络)
        loadedFrom = result.getLoadedFrom();      
        //
        exifOrientation = result.getExifOrientation();      
        bitmap = result.getBitmap();      
        // 返回的resuslt中包括bitmap和inputstream,如果bitmap为null则需要自己从stream中转换
        if (bitmap == null) {        
          InputStream is = result.getStream();        
          try {         
            bitmap = decodeStream(is, data);        
           } finally {         
            Utils.closeQuietly(is);        
             }      
          }   
        }   
        if (bitmap != null) {
         ...   
        //修改stats中记录的图片的个数和占用的内存总大小以及平均内存占用量
        stats.dispatchBitmapDecoded(bitmap);
          //图片是否需要旋转或者其他的操作处理     
          if (data.needsTransformation() || exifOrientation != 0) {   
             synchronized (DECODE_LOCK) {            
                if (data.needsMatrixTransform() || exifOrientation != 0) {         
                   bitmap = transformResult(data, bitmap, exifOrientation);
                   ...      
                  }      
                //自定义的图片处理   
                if (data.hasCustomTransformations()) {            
                   bitmap = applyCustomTransformations(data.transformations, bitmap);
                  ...     
                  }        
              }        
            //记录下图片处理的次数以及处理后的占用的总内存大小以及每张图片的平均内存占用量
            if (bitmap != null) {      
               stats.dispatchBitmapTransformed(bitmap);        
              }      
            }   
          }   
      return bitmap;  
    }




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0