Androidの異なるネットワークをシームレスに要求フレームを切り替えます

最近の研究網易オープンクラス、多くの大規模な牛のシェアがあり、基本的なコードは、ビデオ重いのコードが側にノックされ、かつkotlin言語の使用、kotlin言語に後者をカットします書き込みコードを高めるために学ぶことです。

最高の言語はマップを記述するために使用されたので、私は原理を説明するための図とコードを介していました。

アーキテクチャの説明:

図IHttpProcessに共通のインターフェイスがあるように、このアーキテクチャは、非常に簡単である1、唯一の要求メソッドポストネットワーク、このメソッドを実装するためのインタフェースHttpHelper、VolleyProcess、OkhttpProcess他のクラスがあります。

interface IHttpprocessor{
    fun post(url : String,params : HashMap<String,Object>,callback : ICallBack)
}

2.HttpHelper実施形態が単一IHttpProcessクラスオブジェクトは、親クラスとして、あるVolleyProcess、OkhttpProcess他の異なるフレームのクラスを、保持することができます

ここで、フレームは追加のネットワークインターフェイスを追加したい場合にのみIHttpProcessフレームを達成することができ、異なるIHttpProcessクラスのオブジェクトを設定することで切り替えられます。

class HttpHelper : IHttpprocessor{
    //具体网络框架实现类
    var mIHttpprocessor : IHttpprocessor? = null
    //单例
    companion object {
        private var instance : HttpHelper? = null
        get(){
            if(field == null){
                field = HttpHelper();
            }
            return field;
        }

        @Synchronized
        fun instance():HttpHelper{
            return instance!!
        }
    }
    
    //初始化设置网络框架
    fun init(httpPrecoss:IHttpprocessor){
        mIHttpprocessor = httpPrecoss
    }

    //调用网络请求方法
    override fun post(url: String, params: HashMap<String, Object>, callback: ICallBack) {
        //参数处理
        var finalUrl:String  = appendParams(url,params)
        //具体调用网络框架
        mIHttpprocessor?.post(finalUrl,params,callback)
    }

    private fun appendParams(url: String, params: HashMap<String, Object>):String {
        if(params == null || params.isEmpty()){
            return url
        }
        val stringBuild:StringBuilder = StringBuilder(url)
        if(stringBuild.indexOf("?") <= 0){
            stringBuild.append("?")
        }else{
            if(!stringBuild.toString().endsWith("?")){
                stringBuild.append("&")
            }
        }

        params.forEach {
            stringBuild.append("&"+it.key).append("=").append(encode(it.value.toString()))
        }
        Log.d("HttpHelper","url = " +stringBuild.toString())
        return stringBuild.toString()
    }

    private fun encode(str:String):String{
        return URLEncoder.encode(str,"utf-8")
    }

}

3.フレームワークは、特定のネットワークを使用して、ここで私だけ過ごした2 VolleyProcessとOkhttpProcessフレームワークコードはそれを呼び出すことは非常に簡単です

OkhttpProcessleクラス

class OkHttpProcessor : IHttpprocessor{

    private var client : OkHttpClient? = null
    private var mHandler : Handler? = null
    constructor(){
        client = OkHttpClient()
        mHandler = Handler(Looper.getMainLooper())
    }

    override fun post(url: String, params: HashMap<String, Object>, callback: ICallBack) {
       val requstbody : RequestBody = appendBody(params)
       val request: Request? = Request.Builder().url(url).post(requstbody).build()
        client?.newCall(request)?.enqueue(object : Callback{
            override fun onFailure(call: Call, e: IOException) {
                callback?.onFail()
                e.printStackTrace()
            }

            override fun onResponse(call: Call, response: Response) {
                if(response.isSuccessful()){
                    val str : String = response.body()!!.string()
                    mHandler?.post(Runnable {
                        callback?.onSuncess(str)
                    })
                }
            }

        })
    }

    private fun appendBody(params: HashMap<String, Object>): RequestBody {
        val body : FormBody.Builder = FormBody.Builder()
        if(params == null || params.isEmpty()){
            return body.build();
        }
        params?.forEach(){
            body.add(it.key,it.value.toString())
        }
        return body.build()
    }

}

VolleyProcessクラス

class VolleyPorcess : IHttpprocessor {

    companion object {
        var mQueue:RequestQueue ? = null
    }

    constructor(context:Context){
        mQueue = Volley.newRequestQueue(context)
    }

    override fun post(url: String, params: HashMap<String, Object>, callback: ICallBack) {
        val stringRequest:StringRequest = StringRequest(Request.Method.POST,url,Response.Listener<String> {
            callback.onSuncess(it)
        },Response.ErrorListener{
            Log.d("VolleyPorcess",it.toString())
            callback.onFail()
        })
        mQueue?.add(stringRequest)
    }
}

4.初期化は、ネットワーク・フレームを提供するネットワークはフレームであることをスイッチにコード

class MyApplication : Application(){

    override fun onCreate() {
        super.onCreate()
        //HttpHelper.instance().init(OkHttpProcessor())//使用okhttp
        HttpHelper.instance().init(VolleyPorcess(this))//使用volley
    }
}

5.最後のステップは、コールにあります

 val params: HashMap<String, Object> = HashMap()
        params.put("province_id", 1 as Object)
        HttpHelper.instance().post(
                url,
                params,
                object : HttpCallBack<Response>() {

                    override fun onSucess(response: Response) {
                        Log.d(TAG,response.toString())
                    }
                }
        )

要約:

コードの構造は非常に単純明快ですが、この考え方は合理的なパッケージのコードのためのプロジェクトで、コンポーネント事業の抽出が非常に重要であり、非常に重要です。

ポータル

 

 

 

公開された92元の記事 ウォン称賛27 ビュー90000 +

おすすめ

転載: blog.csdn.net/zhuxingchong/article/details/94382869