Android_オープンフレーム_Vollyの例

12247 ワード

このブログは子墨のオリジナルです。転載は出典を明記してください。
http://blog.csdn.net/zimo2013/article/details/16981945
ブログ主のレベルが限られていますので、間違いがあれば、ご指摘をお願いします。
初心者のために、より良い理解と管理Volly!
(1).Android_オープンフレーム_Volly(Google IO 2013)ソースコードと内部実装分析
(2)
Android_オープンフレーム_Vollyの例
1.カスタム関連クラス
Android_オープンフレーム_Volly(Google IO 2013)ソースコードと内部実装プロセス分析の一文において、Vollyフレーム内実現プロセスを簡単に概説した。Androidマルチスレッド通信機構(Android ThreadマルチスレッドHandler、Message、Looper、Message Queマルチスレッドと特殊UI更新文)を徹底的に熟知すべきであり、JDK 1.5から提供されたjava.util.co ncurrent関連の併発ライブラリとhttpアクセスネットワーク(Android dupdroid/pdringtonit)の要求書とAndropterフォームの作成写真キャッシュ(Android_写真の三級キャッシュ1文)関連知識
https://android.googlesource.com/platform/frameworks/volley
(1).パッケージMyVolly類
Vollyを使用する前に、最初に初期化を行うべきであり、外部のみにRequest Que(requestを追加)とImageLoader(写真をダウンロード)get方法を提供する。
/**
 * MyVolley.java
 * @see http://blog.csdn.net/zimo2013
 * @author zimo2013
 * 
 */
public class MyVolley {
	private static final String TAG = "MyVolley";

	private static MyVolley instance;
	private static RequestQueue mRequestQueue;
	private static ImageLoader mImageLoader;
	private final static int RATE = 8; //              

	private MyVolley(Context context) {
		mRequestQueue = Volley.newRequestQueue(context);

		//    LruCache ,        ,            1/8
		ActivityManager manager = (ActivityManager) context
				.getSystemService(Context.ACTIVITY_SERVICE);
		int maxSize = manager.getMemoryClass() / RATE; //    64M/8,   M

		// BitmapLruCache     class,android        , BitmapLruCache         
		mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache(
				1024 * 1024 * maxSize));

		Log.i(TAG, "MyVolley     ");
	}

	/**
	 *    Volley    ,   Volley        
	 * 
	 * @param context
	 */
	public static void init(Context context) {
		if (instance == null) {
			instance = new MyVolley(context);
		}
	}

	/**
	 *         
	 * 
	 * @return
	 */
	private static RequestQueue getRequestQueue() {
		throwIfNotInit();
		return mRequestQueue;
	}

	/**
	 *   ImageLoader  
	 * 
	 * @return
	 */
	public static ImageLoader getImageLoader() {
		throwIfNotInit();
		return mImageLoader;
	}

	public static void addRequest(Request> request) {
		getRequestQueue().add(request);
	}

	public static void getImage(String requestUrl, ImageView imageView) {
		getImage(requestUrl, imageView, 0, 0);
	}

	public static void getImage(String requestUrl, ImageView imageView,
			int defaultImageResId, int errorImageResId) {
		getImage(requestUrl, imageView, defaultImageResId, errorImageResId, 0,
				0);
	}

	public static void getImage(String requestUrl, ImageView imageView,
			int defaultImageResId, int errorImageResId, int maxWidth,
			int maxHeight) {
		imageView.setTag(requestUrl);
		getImageLoader().get(requestUrl, ImageListenerFactory.getImageListener(
				imageView, defaultImageResId, errorImageResId), maxWidth,
				maxHeight);
	}

	/**
	 *          
	 */
	private static void throwIfNotInit() {
		if (instance == null) {//      
			throw new IllegalStateException("MyVolley     ,        init()");
		}
	}
}
(2).ピクチャの三級キャッシュ関連クラス
/**
 * LruCache     ,     ImageCache  ,    LruCache
 *   bitmap   LruCache    ,      BitmapSoftRefCache ,               ,          
 * 
 * BitmapLruCache.java
 * @author zimo2013
 * @see http://blog.csdn.net/zimo2013
 * 
 */
public class BitmapLruCache extends LruCache implements ImageCache {
	private static final String TAG = "BitmapLruCache";

	private BitmapSoftRefCache softRefCache;

	public BitmapLruCache(int maxSize) {
		super(maxSize);
		softRefCache = new BitmapSoftRefCache();
	}

	@Override
	protected int sizeOf(String key, Bitmap value) {
		return value.getRowBytes() * value.getHeight();
	}

	@Override
	protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {
		if (evicted) {
			LogUtil.i(TAG, "    ,       :" + key);
			//      bitmap  ,      BitmapSoftRefCache
			softRefCache.putBitmap(key, oldValue);
		}
	}

	/**
	 *       
	 */
	@Override
	public Bitmap getBitmap(String url) {
		Bitmap bitmap = get(url);
		//   bitmap null,           
		if (bitmap == null) {
			bitmap = softRefCache.getBitmap(url);
		} else {
			LogUtil.i(TAG, "LruCache  :" + url);
		}
		return bitmap;
	}

	/**
	 *       
	 */
	@Override
	public void putBitmap(String url, Bitmap bitmap) {
		put(url, bitmap);
	}

}
/**
 *         
 * 
 * BitmapSoftRefCache.java
 * @author zimo2013
 * @see http://blog.csdn.net/zimo2013
 *
 */
public class BitmapSoftRefCache implements ImageCache{
	private static final String TAG = "BitmapSoftRefCache";
	
	private LinkedHashMap> map;
	public BitmapSoftRefCache() {
		map = new LinkedHashMap>();
	}

	/**
	 *          Bitmap  
	 */
	@Override
	public Bitmap getBitmap(String url) {
		Bitmap bitmap = null;
		SoftReference softRef = map.get(url);
		if(softRef != null){
			bitmap = softRef.get();
			if(bitmap == null){
				map.remove(url); // map   
				LogUtil.w(TAG, url+"     GC  ");
			}else{
				LogUtil.i(TAG, "  "+url);
			}
		}
		return bitmap;
	}

	/**
	 *          bitmap  
	 */
	@Override
	public void putBitmap(String url, Bitmap bitmap) {
		SoftReference softRef = new SoftReference(bitmap);
		map.put(url, softRef);
	}

}
(3).画像がずれている
このフレームの使用によって、画像のズレが発生しました。AppはImageLoaderを使って画像をダウンロードしました。ListViewのスクロールが速いと、やはりズレが発生します。他の人の話を聞いたことがあります。このフレームを使うと、画像の位置ズレを避けることができますが、結果としてはミスが発生します。ソースを調べても、ミスを避けるための措置が見つかりませんでした。自分の使い方が間違っているかどうかは分かりません。ご承知のように、ブロガーに教えてください。
ここでは、ImageListenerを上書きすることにより、ImageViewを通じてTagタグを指定し、ピクチャのズレを防止します。つまり、ダウンロード済みピクチャのImageUrlと現在のImageViewのTagが同じかどうかです。
public class ImageListenerFactory{
	
	public static ImageListener getImageListener(final ImageView view,
            final int defaultImageResId, final int errorImageResId) {
        return new ImageListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (errorImageResId != 0) {
                    view.setImageResource(errorImageResId);
                }
            }

            @Override
            public void onResponse(ImageContainer response, boolean isImmediate) {
                if (response.getBitmap() != null) {
                	
                    if(view.getTag().toString() == response.getRequestUrl()){
                    	view.setImageBitmap(response.getBitmap());
                    }else{
                    	LogUtil.i(TAG, "    ");
                    }
                } else if (defaultImageResId != 0) {
                    view.setImageResource(defaultImageResId);
                }
            }
        };
    }
}
2.ネットワーク要求Request
(1).StringRequest
public void testStringRequest(){
	String url = "http://www.baidu.com";
	//      ,    StringRequest parseNetworkResponse()  ,  byte[]-->String   
	MyVolley.getRequestQueue().add(new StringRequest(url, new Response.Listener() {

		@Override
		public void onResponse(String response) {
			System.out.println("response:"+response);
		}
	}, new Response.ErrorListener() {

		@Override
		public void onErrorResponse(VolleyError error) {
			
		}
	}));
}
(2)Json Object Request
public void testJsonObjectRequest(){
	String url = "http://api.mobile.meituan.com/group/v1/deal/new-cate-list/android/4.1?cityId=1";
	//      ,    StringRequest parseNetworkResponse()  ,  byte[]-->String   
	MyVolley.getRequestQueue().add(
			new JsonObjectRequest(url,
					null, 
					new Response.Listener() {

						@Override
						public void onResponse(JSONObject response) {
							// JSONObject android     ,                ,    JsonRequest
							
							//  response,    
							try {
								System.out.println(response.get("stid"));
							} catch (JSONException e) {
								e.printStackTrace();
							}
						}
					},new Response.ErrorListener() {

						@Override
						public void onErrorResponse(VolleyError error) {
							System.out.println(error);
						}
					})
			);
}
(3)カスタムRequest(Json解析)
/**
 * MyJsonRequest.java
 * 
 * @author zimo2013
 */
public class MyJsonListRequest extends JsonRequest {
	private Gson gson;
	private Class clazz;
	private String mKey;

	/**
	 * GET    ,   json          clazz  
	 * 
	 * @param url
	 *              url
	 * @param clazz
	 *               class   
	 * @param listener
	 *                   
	 * @param errorListener
	 *                   
	 */
	public MyJsonListRequest(String url, Class clazz, Listener listener,
			ErrorListener errorListener) {
		this(url, null, clazz, listener, errorListener);
	}

	/**
	 * GET    , json  key   value       clazz  
	 * 
	 * @param url
	 *              url
	 * @param key
	 *                 key,NOTE:    root-key,   key   
	 * @param clazz
	 *               class   
	 * @param listener
	 *                   
	 * @param errorListener
	 *                   
	 */
	public MyJsonListRequest(String url, String key, Class clazz,
			Listener listener, ErrorListener errorListener) {
		this(Method.GET, url, null, key, clazz, listener, errorListener);
	}

	/**
	 * 
	 * @param method
	 *                 Use {@link com.android.volley.Request.Method}.
	 * @param url
	 * @param requestBody
	 *               POST  ,    form     ,   name=zhangsan&age=20
	 * @param key
	 *                 key,NOTE:    root-key,   key   
	 * @param clazz
	 *               class   
	 * @param listener
	 *                   
	 * @param errorListener
	 *                   
	 */
	public MyJsonListRequest(int method, String url, String requestBody,
			String key, Class clazz, Listener listener,
			ErrorListener errorListener) {
		super(method, url, null, listener, errorListener);

		this.clazz = clazz;
		mKey = key;
		gson = new Gson();

	}

	@Override
	protected Response parseNetworkResponse(NetworkResponse response) {
		try {
			String json = new String(response.data,
					HttpHeaderParser.parseCharset(response.headers));
			T t = null;
			if(mKey == null){
				t = gson.fromJson(json, clazz);
			}else{
				JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
				t = gson.fromJson(jsonObject.get(mKey), clazz);
			}
			return Response.success(t,
					HttpHeaderParser.parseCacheHeaders(response));
		} catch (UnsupportedEncodingException e) {
			return Response.error(new ParseError(e));
		} catch (JsonSyntaxException e) {
			return Response.error(new ParseError(e));
		}
	}
}
public void testCustomRequest(){
	String urlString = "http://192.168.117.120:8080/news/json.html";
	MyJsonRequest request = new MyJsonRequest(urlString, NewsInfo.class, new Listener() {

		@Override
		public void onResponse(NewsInfo response) {
			System.out.println(response.getClass());
			System.out.println(response);
		}
	}, null);
	MyVolley.getRequestQueue().add(request);
}
(4).POSTフォーム提出
public void testRequestByPost(){
	String urlString = "http://192.168.43.240:8080/news/servlet/Post";
	StringRequest request = new StringRequest(Method.POST, urlString, new Listener() {

		@Override
		public void onResponse(String response) {
			
		}
	}, new ErrorListener() {

		@Override
		public void onErrorResponse(VolleyError error) {
			
		}
	}){
		//  getBody()        
		@Override
		public byte[] getBody() {
			return "name=zhangsan&age=15".getBytes();
		}
	};
	MyVolley.getRequestQueue().add(request);
}
(5).ImageLoader非同期ロードイメージ(ミス防止ビット)
public void testImageLoader(){
	MyVolley.getImageLoader().get(imgUrl, 
			//ImageListenerFactory     ,           ,  UI  
			ImageListenerFactory.getImageListener(//  ImageLoader.getImageListener()
					imageView, 		// ImageView  
					R.drawable.ic_launcher, //   Image,       0
					R.drawable.ic_launcher)); //   Image,       0
}