Volleyの使用とそのツールクラスのパッケージ

37899 ワード

Android:Volleyの使用とそのツールクラスのパッケージ
一.Volleyの概要
Volleyの中国語訳は「斉射、同時」で、2013年のGoogle大会で発表されたAndroidプラットフォームのネットワーク通信ライブラリで、ネットワークリクエストの処理、小画像の非同期ロードとキャッシュなどの機能を持ち、Androidアプリがネットワーク操作をより便利に実行し、より迅速かつ効率的に行うことができる.
Google IOの講演では、火矢を放つ図で、流星に似ている.これは,Volleyがデータ量は大きくないが通信が頻繁なシーンに特に適していることを示している.次の図を参照してください.
Volleyには次のような利点があります.
ネットワーク要求の自動スケジューリング;
高同時ネットワーク接続;
ディスクとメモリの透過的な応答は、標準的なHTTP cache coherence(キャッシュ整合性)によってキャッシュされます.
指定されたリクエストの優先度をサポートします.
ネットワークリクエストcancelメカニズム.単一のリクエストをキャンセルしたり、リクエストキューの領域を指定したりすることができます.
フレームワークはカスタマイズされやすく、例えば、再試行またはロールバック機能をカスタマイズします.
デバッグと追跡ツールが含まれています.
Volleyは大きなデータファイルをダウンロードするのに適していません.Volleyは解析中のすべての応答を維持するからです.大量のデータをダウンロードする操作については、DownloadManagerを使用することを考慮してください.
volleyが発売される前に、android-async-http、retrofit、okhttpなど、成熟したサードパーティのネットワーク通信ライブラリを選択します.彼らはそれぞれ優劣があり、より適切なプロジェクトのクラスライブラリを選択することができます.
付録:
Volleyのgithubアドレス:https://github.com/mcxiaoke/android-volley ;
Google I/O 2013 – Volley: Easy, Fast Networking for Android: https://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded
二.Volley jarパッケージのインポート
VolleyフレームワークのコアコードはAOSP倉庫に管理されているframeworks/volleyで、関連するツールはtoolboxの下に置かれています.
プロジェクトにVolleyを追加する最も簡単な方法はClone倉庫で、libraryプロジェクトに設定します.
1)cloneコード:
git clone https://android.googlesource.com/platform/frameworks/volley

2)コードをjarパッケージにコンパイルする:
android update project -p . ant jar

予期せぬことがなければvolleyを取得します.jarパッケージ.
3)volleyを追加する.JArからあなたのプロジェクトへ:
参照:http://jingyan.baidu.com/article/e6c8503c7190b7e54f1a1893.html
三.Volleyフレームワークの詳細:
Volleyの動作原理図は以下の通りです.
Volleyフレームワークを使用してネットワークデータ要求を実現するには、主に次の3つのステップがあります.
1.RequestQueueオブジェクトを作成し、ネットワーク要求キューを定義する.
2.XXXRequestオブジェクト(XXXはString、JSON、Imageなどを表す)を作成し、ネットワークデータ要求の詳細プロセスを定義する.
3.XXXRequestオブジェクトをRequestQueueに追加し、ネットワークリクエストの実行を開始します.
3.1 RequestQueueオブジェクトの作成
一般に、ネットワーク要求キューはAPP全体で使用されるグローバルオブジェクトであるため、アプリケーションクラスに書き込むことが望ましい.
public class MyApplication extends Application{
    //       
    public static RequestQueue queue;

    @Override
    public void onCreate() {
        super.onCreate();
        queue = Volley.newRequestQueue(getApplicationContext());
    }

    public static RequestQueue getHttpQueue() {
        return queue;
    }
}

AndroidManifestを修正する必要がありますxmlファイルは、APPのApplicationオブジェクトを定義したばかりのMyApplicationにし、INTERNET権限を追加します.
<uses-permission android:name="android.permission.INTERNET" />
<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
application>

3.2 XXXRequestオブジェクトの作成とリクエストキューへの追加
Volleyは、JsonObjectRequest、JsonArrayRequest、StringRequestなどのRequest形式を提供します.
JsonObjectRequest:JSONObjectオブジェクトを返します.
JsonArrayRequest:JsonArrayオブジェクトを返します.
StringRequest:Stringを返します.
RequestカスタムRequestを継承することもできます.
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // GET  
        VolleyGet();

        // POST  
        VolleyPost();
    }

    //   POST     
    private void VolleyPost() {
        //     
        String url = "http://ce.sysu.edu.cn/hope/";

        //   StringRequest,             POST,
        StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener() {
            //           
            @Override
            public void onResponse(String s) {
                //    POST        
                Toast.makeText(MainActivity.this, "POST: " + s, Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            //           
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        }){

            //       
            @Override
            protected Map getParams() throws AuthFailureError {
                Map hashMap = new HashMap();
                hashMap.put("phone", "11111");
                return hashMap;
            }
        };
        //         
        request.setTag("abcPost");

        //          
        MyApplication.getHttpQueue().add(request);
    }

    //   GET     
    private void VolleyGet() {
        //       
        String url = "http://ce.sysu.edu.cn/hope/";
        StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener() {
            @Override
            public void onResponse(String s) {
                //    GET        
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });

        //         
        request.setTag("abcGet");

        //          
        MyApplication.getHttpQueue().add(request);
    }
}

出力:
// POST  
POST: 
// GET  
GET: 

3.3クローズ要求
3.3.1特定ラベルのネットワーク要求を閉じる:
//        "abcGet"
public void onStop() {
    super.onStop();
    MyApplication.getHttpQueues.cancelAll("abcGet");
}

3.3.2このキュー内のすべてのリクエストをキャンセルします.
ActivityのonStop()メソッドでは、このtagを含むすべてのリクエストタスクをキャンセルします.
@Override  
protected void onStop() {  
    super.onStop();  
    mRequestQueue.cancelAll(this);  
}

四.GETとPOST要求ツールライブラリのパッケージ
4.1アプリケーションの書き換え
ネットワーク要求キューは、APPアプリケーションに対して常にグローバルオブジェクトであるため、グローバルに定義できます.このため、LIMSApplicationを新規作成し、Applicationから継承します.
LIMSApplication.JAvaファイル:
public class LIMSApplication extends Application {
    public static RequestQueue volleyQueue;
    @Override
    public void onCreate() {
        super.onCreate();

        /* Volley   */
        //   Volley Http    
        volleyQueue = Volley.newRequestQueue(getApplicationContext());
    }

    //   Volley HTTP      
    public static RequestQueue getRequestQueue() {
        return volleyQueue;
    }
}

AndroidManifestでxmlファイルでアプリケーションのnameと対応するネットワークリクエスト権限を変更します.
<uses-permission android:name="android.permission.INTERNET" />
<application
    android:name=".LIMSApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
application>

4.2 GETとPOST要求のパッケージ:
現在、VolleyRequestUtilツールライブラリには、GETリクエストとPOSTリクエストをそれぞれ取得する2つの関数しか含まれていません.
VolleyRequestUtil.java:
public class VolleyRequestUtil {

    public static StringRequest stringRequest;
    public static Context context;

    /*
    *   GET    
    *   :
    * context:     ;
    * url:   url  ;
    * tag:       ;
    * volleyListenerInterface:VolleyListenerInterface  ;
    * */
    public static void RequestGet(Context context, String url, String tag, VolleyListenerInterface volleyListenerInterface) {
        //         tag    
        LIMSApplication.getRequestQueue().cancelAll(tag);
        //        ,       
        stringRequest = new StringRequest(Request.Method.GET, url, volleyListenerInterface.responseListener(), volleyListenerInterface.errorListener());
        //          
        stringRequest.setTag(tag);
        //              
        LIMSApplication.getRequestQueue().add(stringRequest);
        //         
        LIMSApplication.getRequestQueue().start();
    }

    /*
    *   POST    (      Map)
    *   :
    * context:     ;
    * url:   url  ;
    * tag:       ;
    * params:POST    ;
    * volleyListenerInterface:VolleyListenerInterface  ;
    * */
    public static void RequestPost(Context context, String url, String tag, final Map<String, String> params, VolleyListenerInterface volleyListenerInterface) {
        //         tag    
        LIMSApplication.getRequestQueue().cancelAll(tag);
        //      POST  ,        Map 
        stringRequest = new StringRequest(Request.Method.POST, url, volleyListenerInterface.responseListener(), volleyListenerInterface.errorListener()){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
        };
        //          
        stringRequest.setTag(tag);
        //              
        LIMSApplication.getRequestQueue().add(stringRequest);
        //         
        LIMSApplication.getRequestQueue().start();
    }
}

4.3 Volley要求(成功または失敗)の傍受イベントのカプセル化:
Volleyリクエスト(成功または失敗)のリスニングイベントをカプセル化します.VolleyListenerInterfaceを参照してください.java:
public abstract class VolleyListenerInterface {
    public Context mContext;
    public static Response.Listener mListener;
    public static Response.ErrorListener mErrorListener;

    public VolleyListenerInterface(Context context, Response.Listener listener, Response.ErrorListener errorListener) {
        this.mContext = context;
        this.mErrorListener = errorListener;
        this.mListener = listener;
    }

    //           
    public abstract void onMySuccess(String result);

    //           
    public abstract void onMyError(VolleyError error);

    //          
    public Response.Listener responseListener() {
        mListener = new Response.Listener() {
            @Override
            public void onResponse(String s) {
                onMySuccess(s);
            }
        };
        return mListener;
    }

    //            
    public Response.ErrorListener errorListener() {
        mErrorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                onMyError(volleyError);
            }
        };
        return mErrorListener;
    }
}

4.3 Volleyピクチャーロードライブラリのパッケージ:
Volleyライブラリには、ピクチャのロード機能もあります.しかし、小さなピクチャの非同期ロードに適しており、比較的大きなピクチャリソースの要求には適していない.
Volleyは、ImageRequest、ImageLoader、NetWorkImageViewなど、さまざまなRequestメソッドを提供します.
ネットワークピクチャリソースのリクエストは以下のようにカプセル化されます.
ImageLoaderUtil.java:
public class ImageLoaderUtil {

    /*
    *   ImageRequest       
    * */
    public static void setImageRequest(String url, final ImageView imageView) {
        ImageRequest imageRequest = new ImageRequest(url, new Response.Listener() {
            @Override
            public void onResponse(Bitmap bitmap) {
                imageView.setImageBitmap(bitmap);
            }
        }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                imageView.setBackgroundResource(R.mipmap.ic_launcher);
            }
        });
        LIMSApplication.getRequestQueue().add(imageRequest);
    }

    /*
    *   ImageLoader       
    * */
    public static void setImageLoader(String url, ImageView imageView, int defaultImageResId, int errorImageResId) {
        ImageLoader loader = new ImageLoader(LIMSApplication.getRequestQueue(), new BitmapCache());
        ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(imageView, defaultImageResId, errorImageResId);
        loader.get(url, imageListener);
    }

    /*
    *   Volley NetWorkImageView       
    * */
    public static void setNetWorkImageView(String url, NetworkImageView netWorkImageView, int defaultImageResId, int errorImageResId) {
        ImageLoader loader = new ImageLoader(LIMSApplication.getRequestQueue(), new BitmapCache());

        netWorkImageView.setDefaultImageResId(defaultImageResId);
        netWorkImageView.setErrorImageResId(errorImageResId);
        netWorkImageView.setImageUrl(url, loader);
    }
}

五.VolleyRequestUtilとImageLoaderUtilの使用
5.1 GET方式でネットワークリソースを要求する:
new VolleyRequestUtil().RequestGet(this, "http://ce.sysu.edu.cn/hope/", "hopePage", 
    new VolleyListenerInterface(this, VolleyListenerInterface.mListener, VolleyListenerInterface.mErrorListener) {
    // Volley          
    @Override
    public void onMySuccess(String result) {
        Toast.makeText(this, s, Toast.LENGTH_LONG).show();
    }

    // Volley          
    @Override
    public void onMyError(VolleyError error) {
        // ...
    }
});

出力:厚朴サイトのトップページのソースコード.
5.2 POST方式でネットワーク資源を要求する:
new VolleyRequestUtil().RequestPOST(this, "http://ce.sysu.edu.cn/hope/", "hopePage", 
    new VolleyListenerInterface(this, VolleyListenerInterface.mListener, VolleyListenerInterface.mErrorListener) {
    // Volley          
    @Override
    public void onMySuccess(String result) {
        Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
    }

    // Volley          
    @Override
    public void onMyError(VolleyError error) {
        // ...
    }
});

出力:厚朴サイトのトップページのソースコード.
5.3 ImageRequestでネットワーク画像を表示する:
//      :       、     ImageView
ImageView imgView = (ImageView) findViewById(R.id.imgView);
        new ImageLoaderUtil().setImageRequest("http://7xinb0.com1.z0.glb.clouddn.com/skin/HopeRebuild/dist/images/logo/logo_40.png", imgView);

「レイアウト・ファイル」で、ImageViewを定義します.
<ImageView
        android:id="@+id/imgView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

5.4 ImageLoaderでネットワーク画像を表示する:
//      :       、     ImageView、       ResourceID、           ResourceID
new ImageLoaderUtil().setImageLoader("http://7xinb0.com1.z0.glb.clouddn.com/skin/HopeRebuild/dist/images/logo/logo_40.png", imgView, R.mipmap.default, R.mipmap.error);

「レイアウト・ファイル」で、ImageViewを定義します.
<ImageView
        android:id="@+id/imgView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

5.5 VolleyのNetWorkImageViewでネット画像を表示する:
//      :       、     NetworkImageView、       ResourceID、           ResourceID
NetworkImageView netWorkImageView = (NetworkImageView) findViewById(R.id.imgNetworkView);
        new ImageLoaderUtil().setNetWorkImageView("http://7xinb0.com1.z0.glb.clouddn.com/skin/HopeRebuild/dist/images/logo/logo_40.png", netWorkImageView, R.mipmap.default, R.mipmap.error);

「レイアウト・ファイル」で、NetworkImageViewを定義します.
<com.android.volley.toolbox.NetworkImageView  
               android:id="@+id/imgNetworkView"  
               android:layout_width="300dp"  
               android:layout_height="300dp"  
               android:layout_centerHorizontal="true"/>