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文)関連知識
Vollyを使用する前に、最初に初期化を行うべきであり、外部のみにRequest Que(requestを追加)とImageLoader(写真をダウンロード)get方法を提供する。
このフレームの使用によって、画像のズレが発生しました。AppはImageLoaderを使って画像をダウンロードしました。ListViewのスクロールが速いと、やはりズレが発生します。他の人の話を聞いたことがあります。このフレームを使うと、画像の位置ズレを避けることができますが、結果としてはミスが発生します。ソースを調べても、ミスを避けるための措置が見つかりませんでした。自分の使い方が間違っているかどうかは分かりません。ご承知のように、ブロガーに教えてください。
ここでは、ImageListenerを上書きすることにより、ImageViewを通じてTagタグを指定し、ピクチャのズレを防止します。つまり、ダウンロード済みピクチャのImageUrlと現在のImageViewのTagが同じかどうかです。
(1).StringRequest
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 Requestpublic 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
}