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最简单好用的一点吧。