redes Android diferentes alternar facilmente pedido quadro

Um estudo recente Netease classe aberta, há muitos compartilham grandes gado, é aprender o código básico é o código de heavy vídeo bater para o lado, e a fim de aumentar o uso da linguagem Kotlin, escrever código que irá cortar o último a linguagem Kotlin.

A melhor linguagem é usada para descrever o mapa, então eu estava através do desenho e código para explicar o princípio.

Arquitetura Descrição:

1. Esta arquitectura é muito simples, como existe uma interface comum à FIG IHttpProcess, existe apenas um pedido de rede método de pós, a interface HttpHelper, VolleyProcess, OkhttpProcess outras classes de implementar este método.

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

2.HttpHelper realização é um único IHttpProcess um objecto de classe, tal como uma classe pai pode conter VolleyProcess, OkhttpProcess outras classes de quadro diferentes,

Aqui, o quadro é ligado, definindo diferente objeto de classe IHttpProcess, se você quiser adicionar interface de rede adicional só pode ser alcançado IHttpProcess quadro.

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. A estrutura usa uma rede específica, aqui eu só passei dois VolleyProcess e código do framework OkhttpProcess é muito simples de chamá-lo

classe 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()
    }

}

classe 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. Inicializar a rede desde que a estrutura de rede é um quadro que códigos para alternar

class MyApplication : Application(){

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

5. A última etapa é a chamada

 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())
                    }
                }
        )

resumo:

estrutura de código é muito simples e clara, mas esta ideia é muito importante, no projeto de um código de pacote razoável, extração de componente de negócio é muito importante.

portal

 

 

 

Publicado 92 artigos originais · ganhou elogios 27 · vê 90000 +

Acho que você gosta

Origin blog.csdn.net/zhuxingchong/article/details/94382869
Recomendado
Clasificación