image储存和第三方架包

Assets:
//AssetManager是用来管理assets目录的类
可以通过context的方法。getAssets()拿到assetsmanger对象
可以通过AssetsManger里面的list()path方法,拿到path目录下的文件(或文件夹)列表,列表的内容是字符串数组,可以通过传入“”来到assets根目录的列表
通过assetsmanger里的open(filename)方法拿到filename所指文件的输入流(inputstream)
bitmapFactory里的decodestream()方法可一把一个图片的输入流,做成一个bitmap
public class MainActivity  extends Activity {
      private ImageView  imageView ;
    private AssetManager  am ;

      @Override
      protected void  onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState) ;
         setContentView(R.layout. activity_main) ;
          imageView = (ImageView)findViewById(R.id. image_view) ;
          am = getAssets() ;
         Time time =  new Time() ;
         time.start() ;
//        String[] files = getFileNameFromAssets("drink");
//        for (int i=0;i<files.length;i++){
//            Log.d("--->",""+files[i]);
//        }
//        Bitmap bitmap = getBitmapFromAssets("drink/drink_00.jpg");
//        imageView.setImageBitmap(bitmap);

     }
    Handler  handler new Handler(){
          @Override
          public void  handleMessage(Message msg) {
              super.handleMessage(msg) ;
            switch (msg. what){
                  case  1:
                    Bitmap bitmap =(Bitmap) msg. obj ;
                      imageView.setImageBitmap(bitmap) ;
                    break;
             }
        }
    } ;
    private String[]  getFileNameFromAssets(String path){
        String[] fileName =  null;
        try {
             fileName =  am.list(path) ;
         }  catch (IOException e) {
            e.printStackTrace() ;
         }
          return fileName ;
     }
      private Bitmap  getBitmapFromAssets(String fileName){
       Bitmap bitmap ;
         InputStream in =  null;
        try {
            in =  am.open(fileName) ;
         }  catch (IOException e) {
            e.printStackTrace() ;
         }
        bitmap = BitmapFactory. decodeStream(in) ;
        return bitmap ;
     }
      public class Time  extends Thread{
        Bitmap  bitmap ;
          @Override
          public void  run() {
              super.run() ;
            try {
                String[] files = getFileNameFromAssets( "drink") ;
                for ( int i= 0 ;i<files. length ;i++){
                      sleep( 150) ;
                      bitmap = getBitmapFromAssets( "drink/"+files[i]) ;
                     Message message =  new Message() ;
                     message. what 1 ;
                     message. obj bitmap ;
                      handler.sendMessage(message) ;
                 }

            }  catch (InterruptedException e) {
                e.printStackTrace() ;
             }
        }
    }
}




Picasso  fresco   volleyimageloader  universal Image Loader 

其主要的优缺点  对比 如下 :

1.glide

谷歌推荐的图片加载库  专注于图片流畅的滚动

优点:

使用RGB_565,内存比Picasso小一半

图片的展示与页面的生命周期一致 (对context有类型的要求)

相比Picasso ,glide 在缓存策略和加载GIF方面略胜一筹 减少了缓存文件的大小

Picasso和clide 在磁盘缓存策略上有很大的不同。Picasso 缓存的是全尺寸的 ,而glide 缓存的则是与imageview同样尺寸的
这种情况下 在下次显示的时候 不需要调整大小 显示的会更快

在页面不可见时停止网络请求 停止对图片的解析操作

专注于流畅的滚动

6)当列表在滑动的时候,调用pauseRequests()取消请求,滑动停止时,调用resumeRequests()恢复请求。这样是不是会好些呢?
7)支持当你想清除掉所有的图片加载请求时
8)同时因为Glide和Activity/Fragment的生命周期是一致的,因此gif的动画也会自动的随着Activity/Fragment的状态暂停、重放。Glide 的缓存在gif这里也是一样,调整大小然后缓存。
9)支持gif
但是从我的一次测试结果来看Glide 动画会消费太多的内存,因此谨慎使用。
10)Glide还可以将任何的本地视频解码成一张静态图片。
11)使用glide,你可以配置图片显示的动画,而Picasso只有一种动画:fading in。
12)可以使用thumbnail()产生一个你所加载图片的thumbnail。


2.缺点
1)Glide 功能强大,但代码量大、流转复杂。
3.性能分析
比Picasso性能好一些。

4.风险(包大小等)
包大小:1.3mb
可以 解决listview图片错位问题
picasso

1.picasso 能够根据网络状态调整线程池的并发数量
2.使用简单,源码简单易懂 。Picasso 代码虽然只在一个包下 ,没有严格的包区分,但代码简单,逻辑清楚
3.内部维护了一个监控类 能够实时反馈内存缓存的命中率 使用状态等等

缺点:

argb_888
Picasso的方式则因为需要在显示之前重新调整大小而导致一些延迟,glide 加载显示更快


fresco 

Facebook 出的

优点:

使用了native缓存5.0以下  不包括5.0
支持模糊渐进形式展示图片 类似于webView
能够根据view的展示状态控制网络请求 和图片解析的状态  即在页面不可见的时候 停止对图片的网络请求和解析操作  在页面可见时恢复操作
对多帧动画 支持更好
对外提供清除缓存的方法
缺点:
argb——8888
体积较大 ,集成后增发apk体积
需要使用特定的view 需要xml的支持
包 大小 有 4mb 
volleyimageloader 
谷歌官方出品  ,不能加载本地的图片
universal imageloader
一个强大的图片加载库 包含各种各样的配置 最老牌 使用也是最广泛的
4种方式的比较:1、HttpClient: 在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。
2、HttpURlConnection: 而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。
对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。
谷歌自己也是推荐用HttpUrlConnection,对它进行了大量的优化,这个从安卓的帮助文档可以看出来:
http://developer.android.com/reference/java/net/HttpURLConnection.html
3、OkHttp:是一个相对成熟的解决方案,我们更有理由相信OkHttp的强大。
Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。
OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。
如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。
OkHttp还处理了代理服务器问题和SSL握手失败问题。
使用 OkHttp 无需重写您程序中的网络代码。
OkHttp实现了几乎和java.net.HttpURLConnection一样的API。
其实现在嘛,两者都不用,就用Okhttp
HttpUrlConnection现在的底层实现就是通过Okhttp
网络请求框架支持的功能:
1、支持自定义请求的Header
2、支持Http的基本请求方法:GET、POST
3、支持文件上传和下载
4、可以加载图片
5、支持多任务网络请求操做
6、支持缓存
7、支持请求回调
8、支持session的保持

网络优化建议点:
1、连接复用节省连接建立时间,如开启keep-alive
2、不用域名,用IP直连省去DNS解析过程,根据域名得到IP地址

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值