最近の研究網易オープンクラス、多くの大規模な牛のシェアがあり、基本的なコードは、ビデオ重いのコードが側にノックされ、かつ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())
}
}
)
要約:
コードの構造は非常に単純明快ですが、この考え方は合理的なパッケージのコードのためのプロジェクトで、コンポーネント事業の抽出が非常に重要であり、非常に重要です。