Androidプロジェクト実践(二)-ネットワーク接続


『Androidプロジェクト実践(一)——開発プロセス』ブログでは、プロジェクト開発の大まかな流れを簡単に説明しています.ブロガーの今回のプロジェクトの実践は、自主開発ではなく、他人の応用を模倣することによって行われているため、前期の応用需要設計は分析設計ではない.第2段階のアーキテクチャ設計に直接進みます.このセクションでは、アーキテクチャ設計のネットワーク接続について説明します.
一、なぜネットワーク接続をカプセル化するのか.
Androidには複数のネットワーク接続方式HttpURLConnection,URLConnection,HttpClient,Volley,XUtilsなどが含まれているのではないかという疑問があるかもしれませんが,なぜアプリケーションに単独でネットワーク接続をするのか.理由:Androidが開発したネットワーク接続方式が多様であるため、今後、アプリケーションのアップグレードとメンテナンスでアプリケーション接続ネットワークの方式を変更する可能性があり、ネットワークの接続方式を変更すると、大量のコードを変更する必要があり、プロジェクト全体のエラーを引き起こす可能性があります.しかし、アプリケーションで独自のネットワーク接続方式をカプセル化すると、プロジェクト内のすべてのネットワーク接続が独自のネットワーク接続を使用し、接続方式を変更する場合は、カプセル化された内容を変更するだけでよい.
二、ネットワーク接続方式
『Androidネットワーク接続-URLConnection』『Androidネットワーク接続-HttpURLConnection』『Androidネットワーク接続-HttpClient』『Androidネットワーク接続-Volley』『Androidネットワーク接続-xUtilsネットワークフレームワーク』
三、ネットワーク接続設計
ネットワーク接続をカプセル化する理由については、前述したように、Volley接続ネットワークを使用します(HttpURLConnection,HttpClientは使用しないことをお勧めします.この2つのネットワーク接続にはスレッドが付属していないため、スレッド呼び出しを作成する必要があります).全体コード:
/** * Created by Administrator on 2015/10/9. *            ,           ,       */
public class InternetConnection {
    //       
    private static InternetConnection mConnection;
    private InternetConnection() {
    }
    public static synchronized InternetConnection getInstance() {
        if (mConnection == null) {
            mConnection = new InternetConnection();
        }
        return mConnection;
    }

    /** *            */
    public interface OnConnectionListerner {
        /** *         。 * @param connection         ,    true,     false * @param type       ,         。 */
        void isConnection(boolean connection, String type);

        /** *            。 * @param response          */
        void onSuccessConnection(String response);

        /** *        * @param response   “      ”    * @param statusCode          */
        void onFailConnection(String response, int statusCode);
    }

    /** *   HashMap        * @param url      URL   * @param map       * @param connectionListerner          ,           */
    public void addRequest(String url, final HashMap<String, String> map, final OnConnectionListerner connectionListerner) {
        //       
        if (!NetWorkUtils.isConnection()) {
            connectionListerner.isConnection(false, null);
        } else {
            connectionListerner.isConnection(true, NetWorkUtils.getConnectionType());
        }

        //    
        StringRequest request = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        connectionListerner.onSuccessConnection(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        if(error.networkResponse==null){
                            connectionListerner.onFailConnection("      ", 404);
                        }else {
                            connectionListerner.onFailConnection("      ", error.networkResponse.statusCode);
                        }
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return map;
            }
        };
        //                  
        VolleySingleton.getInstance(BaseApplication.getContext()).addToRequestQueue(request);
    }
}

1、InternetConnectionネットワーク接続単例モード
ネットワーク接続を単一のモードに実装します.一例のモード実現のステップ:1.プライベート化されたオブジェクトを作成し、静的修飾を実現します.2.オブジェクトを作成できないようにプライベートコンストラクタ.3.共有メソッドを対外的に提供して、クラスオブジェクトを取得します.  
    //       
    private static InternetConnection mConnection;
    private InternetConnection() {
    }

    public static synchronized InternetConnection getInstance() {
        if (mConnection == null) {
            mConnection = new InternetConnection();
        }
        return mConnection;
    }

2、傍受内部インタフェースの作成
要求されたネットワーク接続方法を使用してネットワークに接続するときに、このリスナーインタフェースのオブジェクトに送信されるリスニングの内部インタフェースを作成し、ネットワークに接続するかどうか、接続に成功したか失敗したリスニングを実現します.
    /** *            */
    public interface OnConnectionListerner {
        /** *         。 * @param connection         ,    true,     false * @param type       ,         。 */
        void isConnection(boolean connection, String type);

        /** *            。 * @param response          */
        void onSuccessConnection(String response);

        /** *        * @param response   “      ”    * @param statusCode          */
        void onFailConnection(String response, int statusCode);
    }

3、ネットワーク要求方法
ネットワークの要求方法を設定します.ここではVolleyを使用してネットワークに接続します.この方法にはurlアドレス,コミットデータ,リスナーオブジェクトの3つのパラメータがある.
    /** *   HashMap        * @param url      URL   * @param map       * @param connectionListerner          ,           */
    public void addRequest(String url, final HashMap<String, String> map, final OnConnectionListerner connectionListerner) {
        //       
        if (!NetWorkUtils.isConnection()) {
            connectionListerner.isConnection(false, null);
        } else {
            connectionListerner.isConnection(true, NetWorkUtils.getConnectionType());
        }

        //    
        StringRequest request = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        connectionListerner.onSuccessConnection(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        if(error.networkResponse==null){
                            connectionListerner.onFailConnection("      ", 404);
                        }else {
                            connectionListerner.onFailConnection("      ", error.networkResponse.statusCode);
                        }
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return map;
            }
        };
        //                  
        VolleySingleton.getInstance(BaseApplication.getContext()).addToRequestQueue(request);
    }

Point 1:ここでネットワークの接続状態を取得するにはConnectionManagerを使用しています.ここではネットワーク状態の取得もカプセル化します.
public class NetWorkUtils {
    //          
    private  static  ConnectivityManager mManager  = (ConnectivityManager) BaseApplication.getContext().getSystemService(BaseApplication.getContext().CONNECTIVITY_SERVICE);
    private static NetworkInfo networkInfo  = mManager.getActiveNetworkInfo();;

    /** *          * @return     true,     false. */
    public static boolean isConnection(){
        if (networkInfo != null && networkInfo.isConnected()) {
           return true;
        }
        return false;
    }

    /** *           * @return          ,  Wifi. */
    public  static String getConnectionType() {
        String type = "";
        if (networkInfo != null && networkInfo.isConnected()) {
            type = networkInfo.getTypeName();
        } else {
            type = "     ";
        }
        return type;
    }
}

Point 2:ここではVolleyを使用しています.Volleyはバッファプールの原理を使用しているので、「Androidネットワーク接続-Volley」を参照してください.
public class VolleySingleton {

    private static VolleySingleton mInstance;
    private RequestQueue mRequestQueue;//    
    private ImageLoader mImageLoader;//ImageLoader  
    private static Context mCtx;

    private VolleySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();
        mImageLoader = getImageLoader();
    }
    public static synchronized VolleySingleton getInstance(Context context){
        if(mInstance == null){
            mInstance = new VolleySingleton(context);
        }
        return mInstance;
    }
    public RequestQueue getRequestQueue(){
        if(mRequestQueue == null){
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }
    public ImageLoader getImageLoader(){
        if(mImageLoader==null){
            mImageLoader = new ImageLoader(getRequestQueue(), new ImageLoader.ImageCache(){
                private final LruCache<String,Bitmap> cache = new LruCache<String,Bitmap>(20);//      
                @Override
                public Bitmap getBitmap(String url) {
                    return null;
                }
                @Override
                public void putBitmap(String url, Bitmap bitmap) {
                }
            });
        }
        return mImageLoader;
    }
    //         
    public void addToRequestQueue(Request req){
        getRequestQueue().add(req);
    }
}

ネットワーク接続のテストに成功し、ネットワーク接続をカプセル化しました.