Android利用Volley异步加载数据完整详细示例(二)

简介: MainActivity如下:package cc.y;import android.app.Activity;import android.
MainActivity如下:
package cc.y;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.util.LruCache;
import android.widget.ImageView;
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.ImageLoader.ImageCache;
import com.android.volley.toolbox.ImageLoader.ImageListener;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;
/**
 * Demo描述:
 * 去年一个项目中简单的使用了Volley,参见:
 * http://blog.csdn.net/lfdfhl/article/details/12223345
 * 最近guolin写了几篇文章详细介绍Volley,所以在此比较系统地学习一下.
 * 在本示例中,主要包括:
 * 1 利用ImageRequest为ImageView加载网络图片
 * 2 利用ImageLoader为ImageView加载网络图片
 * 3 利用NetworkImageView为ImageView加载网络图片

 * 
 * 注意事项:
 * 1 引入jar包volley.jar
 * 2 网络权限<uses-permission android:name="android.permission.INTERNET"/>
 * 3 Volley源码分析,请参见:
 *   http://blog.csdn.net/guolin_blog/article/details/17656437
 * 4 自定义的XMLRequest和GsonRequest,请参见:
 *   http://blog.csdn.net/guolin_blog/article/details/17612763
 * 
 * 学习资料:
 * http://blog.csdn.net/guolin_blog/article/details/17482165
 * Thank you very much
 *
 */
public class MainActivity extends Activity {
	private Context mContext;
	private RequestQueue mRequestQueue;
	private String mUrl="http://avatar.csdn.net/6/6/D/1_lfdfhl.jpg";
	private ImageView mImageView;
	private ImageRequest mImageRequest;
	private ImageLoader mImageLoader;
	private ImageListener mImageListener;
	private NetworkImageView mNetworkImageView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
        //volley_ImageRequest();
        //volley_ImageLoader();
        volley_NetworkImageView();
    }
    
    private void init(){
    	mContext=this;
    	mImageView=(ImageView) findViewById(R.id.imageView);
    	mNetworkImageView=(NetworkImageView) findViewById(R.id.networkImageView);
    }
    
    //利用ImageRequest为ImageView加载网络图片
	private void volley_ImageRequest() {
		mRequestQueue = Volley.newRequestQueue(mContext);
		mImageRequest = new ImageRequest(
			mUrl, 
			new Response.Listener<Bitmap>() {
			  @Override
			  public void onResponse(Bitmap response) {
				mImageView.setImageBitmap(response);
			}}, 
		   0, 
		   0, 
		   Config.ARGB_8888, 
		   new Response.ErrorListener() {
			@Override
			public void onErrorResponse(VolleyError error) {
				System.out.println("获取图片失败,所以加载一个默认图片");
				mImageView.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_launcher));
			}
		});
		mRequestQueue.add(mImageRequest);
	}
	
	
	
	
	
	//利用ImageLoader为ImageView加载网络图片
	private void volley_ImageLoader(){
		mRequestQueue = Volley.newRequestQueue(mContext);
		mImageLoader=new ImageLoader(mRequestQueue, new ImageCacheImpl());
		mImageListener=ImageLoader.getImageListener(mImageView, R.drawable.ic_launcher, R.drawable.ic_launcher);
		mImageLoader.get(mUrl, mImageListener);
		//mImageLoader.get(mUrl, mImageListener,250,250);
	}
	
	//利用LruCache实现图片缓存机制
	//请参见:
	//http://blog.csdn.net/lfdfhl/article/details/18350601
	private class ImageCacheImpl implements ImageCache {
		private LruCache<String, Bitmap> mLruCache;
		public ImageCacheImpl() {
			int maxSize = 15 * 1024 * 1024;
			mLruCache = new LruCache<String, Bitmap>(maxSize) {
				@Override
				protected int sizeOf(String key, Bitmap bitmap) {
					return bitmap.getRowBytes() * bitmap.getHeight();
				}
			};
		}

		@Override
		public Bitmap getBitmap(String url) {
			return mLruCache.get(url);
		}
		@Override
		public void putBitmap(String url, Bitmap bitmap) {
			mLruCache.put(url, bitmap);
		}
	}
	
	
	
	
	
	//利用NetworkImageView为ImageView加载网络图片
	private void volley_NetworkImageView(){
		mRequestQueue = Volley.newRequestQueue(mContext);
		mImageLoader=new ImageLoader(mRequestQueue, new ImageCacheImpl());
		mNetworkImageView.setDefaultImageResId(R.drawable.ic_launcher);
		mNetworkImageView.setErrorImageResId(R.drawable.ic_launcher);
		mNetworkImageView.setImageUrl(mUrl, mImageLoader);
	}
	
}

main.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="学习Volley(二)" 
        android:layout_centerHorizontal="true"
     />
    
    <ImageView 
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dip"
        />
    
    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/networkImageView"
        android:layout_width="120dip"
        android:layout_height="120dip"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="150dip"
    />

</RelativeLayout>


相关文章
|
27天前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
108 4
|
4月前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
2月前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
37 1
|
2月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
88 0
|
4月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
111 1
|
4月前
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
51 0
|
缓存 Java Android开发
使用Android新式LruCache缓存图片,基于线程池异步加载图片
import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.
957 0