Volley==Volleyフレームワークの基本的な使い方


今appを開発して、ネット操作が欠かせないと言えますが、今日はandroidネットワークフレームワークvolleyの使い方を紹介します.
volleyの概要
Volleyホームページ https://android.googlesource.com/platform/frameworks/volley  Githubアドレス https://github.com/mcxiaoke/android-volley
Volley:2013年Google I/O大会で発表された新しいAndroidネットワーク通信フレームワークは、ネットワーク通信をより速く、より簡単に、より丈夫にすることができます.
機能:  Json、画像などの非同期ダウンロード  ネットワークリクエストのソート(scheduling)  ネットワークリクエストの優先度処理  キャッシュ  マルチレベルキャンセルリクエスト  Activityライフサイクルと連動(Activity終了時にすべてのリクエストを同時にキャンセル)
volleyの使用:  compile 'com.mcxiaoke.volley:library:1.0.19'
基本的な使い方
StringRequestの使用方法: 
プレゼンテーション:StringRequestによるgetリクエストの送信
private void getStringRequest() {
            String url="http://api.k780.com:88/?app=phone.get&phone=13800138000&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
            RequestQueue queue= Volley.newRequestQueue(this);
            StringRequest request=new StringRequest(url, new Response.Listener() {
                @Override
                public void onResponse(String s) {
                    Log.e("success",s);
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {

                }
            });
            queue.add(request);
        }

プレゼンテーション:StringRequestによるpostリクエストの送信
 private void postStringRequest() {
        String url="http://api.k780.com:88/?app=phone.get";
        RequestQueue queue=Volley.newRequestQueue(this);
        StringRequest request=new StringRequest(Request.Method.POST, url, new Response.Listener() {
            @Override
            public void onResponse(String s) {
                Log.e("sucess",s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        }){
            @Override
            protected Map getParams() throws AuthFailureError {
                Map map=new HashMap<>();
                map.put("phone","13800138000");
                map.put("appkey", "10003");
                map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
                map.put("format", "json");
                map.put("idcard", "110101199001011114");
                return map;
            }
        };
        queue.add(request);
    }

上記のコードにより,StringRequestはgetとpostリクエストを送信できるが,サーバが返すデータはStringタイプで受信されることがまとめられる.  StringRequestによるリクエストの送信には、一般的に次の3つのステップが必要です.  1.リクエストキューRequestQueueの作成  2.StringRequestオブジェクトの作成  3.要求キューに要求オブジェクトを追加する
JsonRequestの使い方:  プレゼンテーション:JsonRequestによるgetリクエストの送信
private void getJsonRequest() {
            String url="http://api.k780.com:88/?app=phone.get&phone=13800138000&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
            RequestQueue queue= Volley.newRequestQueue(this);
            JsonObjectRequest request=new JsonObjectRequest(url, new Response.Listener() {
                @Override
                public void onResponse(JSONObject jsonObject) {
                    Log.e("success",jsonObject.toString());
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {

                }
            });
            queue.add(request);
        }

プレゼンテーション:JsonRequestからpostリクエストを送信
private void postJsonRequest() {
            String url="http://api.k780.com:88/?app=phone.get";
            RequestQueue queue=Volley.newRequestQueue(this);
            JsonObjectRequest request=new JsonObjectRequest(Request.Method.POST, url, new Response.Listener() {
                @Override
                public void onResponse(JSONObject jsonObject) {
                    Log.e("success",jsonObject.toString());
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {

                }
            }){
                @Override
                protected Map getParams() throws AuthFailureError {
                    Map map=new HashMap<>();
                    map.put("phone","13800138000");
                    map.put("appkey", "10003");
                    map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
                    map.put("format", "json");
                    map.put("idcard", "110101199001011114");
                    return map;
                }
            };
            queue.add(request);
        }

以上の解析から,StringRequestとJsonObjectRequestの用法は基本的に同じであるが,受信したデータ型が異なるだけであることが分かった.  同じように、JsonArrayRequestの方法も上記の使い方とは差が少なく、ここではあまり紹介しません.
パッケージVolley:  具体的な実現機能は以下の通りである.  getリクエストの送信  postリクエストの送信  ネットワーク画像のロード  画像をアップロード
Volleyが管理するクラス:
/**
 *    
 * @author Yan
 */
public class MyVolley {
    private static final String TAG="MyVolley";
    private static MyVolley instance;
    //    
    private static RequestQueue mRequestQueue;
    //  ImageLoader
    private static ImageLoader mImageLoader;
    //             
    private final static int RATE=8;

    public MyVolley(Context context){
        //       (    5   )
        mRequestQueue=Volley.newRequestQueue(context);
        //  ActivityManager   
        ActivityManager manager=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        int maxSize=manager.getMemoryClass()/RATE;
        //   ImageLoader  
        mImageLoader=new ImageLoader(mRequestQueue, new BitmapLruCache(1024*1024*maxSize));
        Log.e(TAG, "MyVolley     ");
    }

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

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

    /**
     *   ImageLoader
     */
    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);
        try {
            getImageLoader().get(
                    requestUrl,
                    ImageListenerFactory.getImageListener(imageView,
                            defaultImageResId, errorImageResId), maxWidth,
                            maxHeight);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *          
     */
    private static void throwIfNotInit() {
        if (instance == null) {
            throw new IllegalStateException("MyVolley     ,        init()");
        }
    }
}

上記のコードにより、主に次の方法が提供されます.  1.構築方法では、グローバルなリクエストキューRequestQueueを初期化し、ImageLoaderを初期化します.  2.メッセージキューの取得  3.ImageLoaderオブジェクトの取得  4.メッセージキューへのリクエストの追加  5.画像のロード  注意:MyVolleyを使用する場合は、必ずアプリケーションのグローバルなアプリケーションで初期化してください.  MyVolley.init(getApplicationContext());
ロード画像に含まれる2つのキャッシュクラスは以下の通りです.
/**
 *      (Lru  )
 * @author Yan
 *
 */
public class BitmapLruCache extends LruCache implements ImageCache{
    private static final String TAG="BitmapLruCache";
    //        
    private BitmapSoftRefCache softRefCache;

    public BitmapLruCache(int maxSize) {
        super(maxSize);
        //   BitmapSoftRefCache
        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){
            // bitmap          
            softRefCache.putBitmap(key, oldValue);
        }

    }

    /**
     *         
     */
    @Override
    public Bitmap getBitmap(String url) {
        Bitmap bitmap=get(url);
        if(bitmap==null){
            //         
            bitmap=softRefCache.getBitmap(url);
        }
        return bitmap;
    }

    /**
     *          
     */
    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        put(url, bitmap);
    }
}
/**
 *        (   )
 * @author Yan
 *
 */
public class BitmapSoftRefCache implements ImageCache {
    private static final String TAG="BitmapSoftRefCache";
    //        Bitmap
    private LinkedHashMap> map;

    public BitmapSoftRefCache(){
        map=new LinkedHashMap<>();
    }

    /**
     *     url      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);
            }
        }
        return null;
    }

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

}
/**
 *         
 * @author Yan
 *
 */
public class ImageListenerFactory {
    private static final String TAG="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().equals(response.getRequestUrl())){
                        view.setImageBitmap(response.getBitmap());
                    }
                }
                else if(defaultImageResId!=0){
                    view.setImageResource(defaultImageResId);
                }
            }
        };
    }
}

ここで画像をロードするにはLRUアルゴリズムを採用し、ソフトリファレンスと組み合わせて使用すると、メモリの管理がよりよくなり、コードの注釈が詳細になっているので、理解できると思います.
/**
 *       (       )
 * @author Yan
 */
public abstract class MyReponseListener implements Response.Listener {
    @Override
    public void onResponse(BaseVO arg0) {
        onMyResponse(arg0);
    }

    public boolean onMyResponse(BaseVO t) {
        //      DialogMaker.closeProgressDialog();
        //        
        ...
        return true;
    }
}

/**
 *            
 * 
 * @author Yan
 * 
 */
public abstract class MyErrorListener implements ErrorListener {

    public void onErrorResponse(VolleyError error) {
        //           
        ...
    }
}

次に、要求サーバがデータを返してオブジェクトにカプセル化するGsonRequestを提供します.
public class GsonRequest extends Request{
    private static final String TAG="GsonRequest";
    //    ,  10 
    private int defaultHttpTimeOut=10*1000;
    //    
    private Listener listener;
    //    
    private Type type;
    //    
    private Map methodBody; 

    /**
     * get  
     * 
     * @param url
     * @param type
     * @param listener
     * @param errorListener
     */
    public GsonRequest(String url, Type type, Listener listener,
            ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        //      (   true)
        setShouldCache(false);
        this.type = type;
        this.listener = listener;
        //       
        this.setRetryPolicy(new DefaultRetryPolicy(defaultHttpTimeOut,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    }


    /**
     * post  
     * 
     * @param methodName
     * @param methodBoby
     * @param type
     * @param listener
     * @param errorListener
     */
    public GsonRequest(String url, Map methodBoby, Type type,
            Listener listener, ErrorListener errorListener) {
        super(Method.POST, url, errorListener);
        this.methodBody = methodBoby;
        this.listener = listener;
        this.type = type;
        //      
        setShouldCache(false);
        //       
        this.setRetryPolicy(new DefaultRetryPolicy(defaultHttpTimeOut,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    }

    /**
     *       
     */
    @Override
    protected Map getParams() throws AuthFailureError {
        if(methodBody==null){
            return super.getParams();
        }
        //      ,      
        Map map=new LinkedHashMap<>();
        //----            
        //map.put(key,value);
        //------
        //------
        //    
        Iterator> iter=methodBody.entrySet().iterator();
        while(iter.hasNext()){
            Entry entry=iter.next();
            map.put(entry.getKey(), entry.getValue());
        }
        return map;
    }

    /**
     *                  
     */
    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        try {
            //        (  Content-Type        ,      ,     ISO-8859-1)
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(parseNetworkResponseDelegate(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (Exception e) {
            return Response.error(new ParseError(e));
        }
    }

    /**
     *           gson    
     */
    private BaseVO parseNetworkResponseDelegate(String jsonString) {
            return new Gson().fromJson(jsonString, type);
    }

    /**
     *            
     */
    @Override
    protected void deliverResponse(BaseVO arg0) {
        listener.onResponse(arg0);
    }
}

次に、要求サーバがXML形式のデータを返した後のXML Requestを示します.
**
 *     XML      
 * @author Yan
 */
public class XMLRequest extends Request{
    private Listener mListener;

    public XMLRequest(int method, String url, Listener listener,
            ErrorListener errorListener){
        super(method, url, errorListener);
        //     
        setShouldCache(false);
        mListener=listener;
    }

    public XMLRequest(String url, Listener listener, ErrorListener errorListener) {
        this(Method.GET, url, listener, errorListener);
    }


    /**
     *           
     */
    @Override
    protected Response parseNetworkResponse(
            NetworkResponse response) {
        try {  
            String xmlString = new String(response.data,  
                    HttpHeaderParser.parseCharset(response.headers));  
            //      
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  
            //     
            XmlPullParser xmlPullParser = factory.newPullParser();  
            //      
            xmlPullParser.setInput(new StringReader(xmlString));  
            return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));  
        } catch (UnsupportedEncodingException e) {  
            return Response.error(new ParseError(e));  
        } catch (XmlPullParserException e) {  
            return Response.error(new ParseError(e));  
        }  
    }

    /**
     *     
     */
    @Override
    protected void deliverResponse(XmlPullParser response) {
        mListener.onResponse(response);
    }
}

ファイルアップロード(マルチファイル対応)のPostUploadRequestを次に示します.
public class PostUploadRequest extends Request{
       /**
     *           
     */
    private Listener mListener ;
    /*              */
    private List mListItem ;

    private String BOUNDARY = "--------------520-13-14"; //     
    private String MULTIPART_FORM_DATA = "multipart/form-data";

    public PostUploadRequest(String url, List listItem, Listener listener,
            ErrorListener errorListener) {
        super(Method.POST, url, errorListener);
        this.mListener = listener ;
        setShouldCache(false);
        mListItem = listItem ;
        //         ,             ,        ,  10 
        setRetryPolicy(new DefaultRetryPolicy(10*1000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    }

    /**
     *         
     * @param response Response from the network
     * @return
     */
    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        try {
            String mString =
                    new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(mString,
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        }
    }

    /**
     *        
     * @param response The parsed response returned by
     */
    @Override
    protected void deliverResponse(String response) {
        mListener.onResponse(response);
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        if (mListItem == null||mListItem.size() == 0){
            return super.getBody() ;
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
        int N = mListItem.size() ;
        for (int i = 0; i < N ;i++){
            FormImage formImage = mListItem.get(i) ;
            StringBuffer sb= new StringBuffer() ;
            /*   */
            //`"--" + BOUNDARY + "\r
"` sb.append("--"+BOUNDARY); sb.append("\r
") ; /* */ //Content-Disposition: form-data; name=" "; filename=" " + "\r
" sb.append("Content-Disposition: form-data;"); sb.append(" name=\""); sb.append(formImage.getName()) ; sb.append("\"") ; sb.append("; filename=\"") ; sb.append(formImage.getFileName()) ; sb.append("\""); sb.append("\r
") ; /* */ //Content-Type: mime + "\r
" sb.append("Content-Type: "); sb.append(formImage.getMime()) ; sb.append("\r
") ; /* */ //"\r
" sb.append("\r
") ; try { bos.write(sb.toString().getBytes("utf-8")); /* */ // + "\r
" bos.write(formImage.getValue()); bos.write("\r
".getBytes("utf-8")); } catch (IOException e) { e.printStackTrace(); } } /* */ //`"--" + BOUNDARY + "--" + "\r
"` String endLine = "--" + BOUNDARY + "--" + "\r
" ; try { bos.write(endLine.toString().getBytes("utf-8")); } catch (IOException e) { e.printStackTrace(); } return bos.toByteArray(); } //Content-Type: multipart/form-data; boundary=----------8888888888888 @Override public String getBodyContentType() { return MULTIPART_FORM_DATA+"; boundary="+BOUNDARY; } }

アップロードファイルのFormImageクラスは次のとおりです.
public class FormImage {
    //     
    private String name ;
    //   
    private String fileName ;
    //   mine
    private String mime ;
    //       
    private File file ;

    public FormImage() {
    }

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public String getMime() {
        return mime;
    }

    public void setMime(String mime) {
        this.mime = mime;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //          
    public byte[] getValue() {
        byte[] buffer = null;
        try {
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
            byte[] b = new byte[1024];
            int n;
            while ((n = fis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            fis.close();
            bos.close();
            buffer = bos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }

次に、パッケージングされたメソッドを使用してネットワークリクエストを行う方法を示します. 
1.getリクエストの送信:
private void getMyVolley() {
        String url="http://api.k780.com:88/?app=idcard.get&idcard=110101199001011114&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
        GsonRequest request=new GsonRequest(url, PersonInfoBean.class, new MyReponseListener() {

            @Override
            public void onResponse(BaseVO t) {
                super.onResponse(t);
                PersonInfoBean bean=(PersonInfoBean) t;
                Log.e("success", bean.toString());
            }

        }, new MyErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                super.onErrorResponse(error);
            }

        });
        MyVolley.addRequest(request);
    }

2.postリクエストの送信:
private void postMyVolley() {
        String url="http://api.k780.com:88/?app=idcard.get";
        Map map=new HashMap<>();
        map.put("appkey", "10003");
        map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
        map.put("format", "json");
        map.put("idcard", "110101199001011114");
        GsonRequest request=new GsonRequest(url, map, PersonInfoBean.class, new MyReponseListener() {

            @Override
            public void onResponse(BaseVO vo) {
                super.onResponse(vo);
                PersonInfoBean bean=(PersonInfoBean) vo;
                Log.e("sucess", bean.toString());
            }

        }, new MyErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                super.onErrorResponse(error);
            }

        });
        MyVolley.addRequest(request);
    }

3.マルチファイルプレゼンテーションのアップロード:
//      
        String url="http://192.168.1.107:8080/FileUpload/FileServlet";
        List list=new ArrayList<>();
        String path1= Environment.getExternalStorageDirectory().getPath()+File.separator+"ss.png";
        String path2= Environment.getExternalStorageDirectory().getPath()+File.separator+"ic_launcher.png";
        File file1=new File(path1);
        File file2=new File(path2);

        FormImage f1=new FormImage();
        f1.setFile(file1);
        f1.setFileName("t1");
        f1.setName("file1");
        f1.setMime("image/png");
        list.add(f1);

        FormImage f2=new FormImage();
        f2.setFile(file2);
        f2.setFileName("t2");
        f2.setName("file2");
        f2.setMime("image/png");
        list.add(f2);


        PostUploadRequest request=new PostUploadRequest(url, list, new Response.Listener() {
            @Override
            public void onResponse(String s) {
                Log.e("success",s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });
        MyVolley.addRequest(request);
    }

4.要求を送信し、サーバはXMLを返す:
private void getXml() {
        String url="http://flash.weather.com.cn/wmaps/xml/china.xml";
        XMLRequest request=new XMLRequest( url, new Response.Listener() {
            @Override
            public void onResponse(XmlPullParser xmlPullParser) {
                try {
                    int eventType = xmlPullParser.getEventType();
                    while (eventType != XmlPullParser.END_DOCUMENT) {
                        switch (eventType) {
                            case XmlPullParser.START_TAG:
                                String nodeName = xmlPullParser.getName();
                                if ("city".equals(nodeName)) {
                                    String pName = xmlPullParser.getAttributeValue(0);
                                    Log.e("TAG", "city is " + pName);
                                }
                                break;
                        }
                        eventType = xmlPullParser.next();
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });
        MyVolley.addRequest(request);
    }

4.ImageLoaderで画像をロードする:
public class MyAdapter extends  BaseAdapter{
    private Context context;
    private List list;
    private LayoutInflater mInflater;
    public ViewHolder holder;
    public MyAdapter(Context context, List list) {
        this.context = context;
        this.list = list;
        this.mInflater=LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        holder=null;
        if(convertView==null){
            convertView=mInflater.inflate(R.layout.itemone, null);
            holder=new ViewHolder();
            holder.iv_image=(ImageView) convertView.findViewById(R.id.iv_image);
            holder.tv_name=(TextView) convertView.findViewById(R.id.tv_name);
            convertView.setTag(holder);
        }
        else{
            holder=(ViewHolder) convertView.getTag();
        }
        Person bean=list.get(position);
        holder.tv_name.setText(bean.getName());
        MyVolley.getImage(bean.getImgUrl(), holder.iv_image, R.mipmap.ic_launcher, R.mipmap.ic_launcher,150,150);
        return convertView;
    }

    class ViewHolder{
        private TextView tv_name;
        private ImageView iv_image;
    }
}

ここでは、Volleyをカプセル化する方法と、カプセル化されたMyVolleyを使用してネットワークリクエストを行う方法について説明します. 
プレゼンテーション: 
今日はこのように多くのことを言って、みんなはきっとVolleyに対して基本的な掌握の情況を達成することができることを信じて、この文章は主に実戦の角度から出発して、主にみんなにvolleyのフレームワークのパッケージの使い方を体験させて、volleyのソースコードの本編の文章は触れていないで、しかしこの完全にみんながvolleyを使うことに影響しないで、後続の時間は私はソースコードの角度からvolleyを分析することができますこんなにたくさん話して、少しお腹が空いたので、今日はここまでにして、みんな早くVolleyの操作を練習しましょう~!
ソースリンク:http://download.csdn.net/detail/a1002450926/9379197