Android 谷歌 开源 通信框架 VOLLEY(三)——图片加载处理

3.ImageRequest
这里写图片描述

package com.example.VolleyDemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import static com.android.volley.Response.*;

public class ImageActivity extends Activity {

    private ImageView mImageResult;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image);

        mImageResult = (ImageView) findViewById(R.id.ImageTxt);
    }

    RequestQueue mQueue;
    @Override
    protected void onStart() {
        super.onStart();

        /********************4步骤********************/
        //1.创建一个RequestQueue对象
        mQueue = Volley.newRequestQueue(this);

        //2.启动RequestQueue
        mQueue.start();

        //3.创建一个ImageRequest
        ImageRequest imageRequest = new ImageRequest(
                "http://developer.android.com/images/home/aw_dac.png",
                new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap response) {
                        mImageResult.setImageBitmap(response);
                    }
                }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {//颜色属性,每个像素用2byte存储,红色占5位,绿色占6位,蓝色占5位
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(ImageActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
            }
        });

        //4.将ImageRequest对象添加到RequestQueue里面
        imageRequest.setShouldCache(false);
        mQueue.add(imageRequest);
        /******************************************/
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mQueue!=null){
            mQueue.cancelAll(this);
        }
    }
}

成功回调处理的参数:宽度 高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性。

4.ImageLoader
这里写图片描述

package com.example.VolleyDemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import static com.android.volley.Response.*;

public class ImageLoaderActivity extends Activity {

    private ImageView mImageResult;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loader);

        mImageResult = (ImageView) findViewById(R.id.LoaderTxt);
    }

    RequestQueue mQueue;
    @Override
    protected void onStart() {
        super.onStart();

        /********************5步骤********************/
        //1.创建一个RequestQueue对象
        mQueue = Volley.newRequestQueue(this);

        //2.启动RequestQueue
        mQueue.start();

        //3.创建一个ImageLoader对象
        ImageLoader imageLoader = new ImageLoader(mQueue, new ImageLoader.ImageCache() {
            @Override
            public void putBitmap(String url, Bitmap bitmap) {
            }

            @Override
            public Bitmap getBitmap(String url) {
                return null;
            }
        });

        //4.获取一个ImageListener对象。
        ImageLoader.ImageListener listener = ImageLoader.getImageListener(mImageResult,
                R.drawable.default_image, R.drawable.failed_image);

        //5.调用ImageLoader的get()方法加载网络上的图片。
        imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener, 400, 400);

        /******************************************/
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mQueue!=null){
            mQueue.cancelAll(this);
        }
    }
}

ImageLoader明显要比ImageRequest更加高效,因为它可以帮我们对图片进行缓存。

先new出一个空的ImageCache的实现即可。
get()方法的重载,指定图片允许的最大宽度和高度。
ImageCache对象是一个空的实现,完全没能起到图片缓存的作用。其实写一个ImageCache也非常简单,

但是如果想要写一个性能非常好的ImageCache,最好就要借助Android提供的LruCache功能了。
/ 重写此方法来衡量每张图片的大小,默认返回图片数量。

这里写图片描述
使用了系统分配给应用程序的八分之一内存来作为缓存大小。在中高配置的手机当中,这大概会有32兆(256/8)的缓存空间。一个全屏幕的 GridView 使用9张 1000x800分辨率的图片来填充,则大概会占用7兆的空间(1000*800*9)。因此,这个缓存大小可以存储32/7=5页的图片。

5.NetworkImageView

package com.example.VolleyDemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.*;

import static com.android.volley.Response.*;

public class NetworkImageViewActivity extends Activity {

    private NetworkImageView mImageResult;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view);

        mImageResult = (NetworkImageView) findViewById(R.id.network_image_view);
    }

    RequestQueue mQueue;
    @Override
    protected void onStart() {
        super.onStart();

        /********************5步骤********************/
        //1.创建一个RequestQueue对象
        mQueue = Volley.newRequestQueue(this);

        //2.启动RequestQueue
        mQueue.start();

        //3.创建一个ImageLoader对象
        ImageLoader imageLoader = new ImageLoader(mQueue, new ImageLoader.ImageCache() {
            @Override
            public void putBitmap(String url, Bitmap bitmap) {
            }

            @Override
            public Bitmap getBitmap(String url) {
                return null;
            }
        });

        //4.获取一个ImageListener对象。
        mImageResult.setDefaultImageResId(R.drawable.default_image);
        mImageResult.setErrorImageResId(R.drawable.failed_image);
        mImageResult.setImageUrl("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", imageLoader);

        /******************************************/
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mQueue!=null){
            mQueue.cancelAll(this);
        }
    }
}

activity_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:background="@android:color/white"
              android:gravity="center"
              android:orientation="vertical">

    <com.android.volley.toolbox.NetworkImageView
            android:id="@+id/network_image_view"
            android:layout_width="200dp"
            android:layout_height="400dp" />

</LinearLayout>

这里写图片描述

  自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上加入了加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单。

  NetworkImageView并不需要提供任何设置最大宽高的方法也能够对加载的图片进行压缩。这是由于NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存,这也是NetworkImageView最简单好用的一点吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值