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.