使用koltin 进行简单网络封装
1 创建retrofit 请求接口
interface ApiNet { @FormUrlEncoded @POST("/user/login") fun Logins(@Field("username")username:String,@Field("password") password:String):Observable<BaseBen<LoginBen>> }
2 retrofit 封装
class RetrofitFactory private constructor() {
private lateinit var retrofit: Retrofit
/**
* 单利双重校验
*
*
*/
companion object {
val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
RetrofitFactory()
}
}
init {
createRetrofit()
}
//创建对象
fun createRetrofit():Retrofit {
retrofit = Retrofit.Builder()
.baseUrl("https://www.wanandroid.com")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
return retrofit
}
//创建方法
fun <T> getSevers(sever: Class<T>): T {
return retrofit.create(sever)
}
//发送请求
fun <T> sendRequset(con:Context,Ob: Observable<T>, lisber:Back<T>){
ShowD.Show(con)
Ob.compose(RxThreadUtils.observableToMain())
.subscribe(object : Observer<T> {
override fun onSubscribe(d: Disposable) {
}
override fun onError(e: Throwable) {
ShowD.cancel()
lisber.onFailed(e.message.toString())
Log.e("失败", "${e.message}")
}
override fun onComplete() {
}
override fun onNext(t: T) {
ShowD.cancel()
lisber.onSuccess(t)
Log.e("失败", "${t}")
}
})
}
}
4 请求 数据类
data class BaseBen<out T>(val errorCode:Int, val errorMsg:String, val data:T)data class LoginBen( val admin: Boolean, val chapterTops: List<Any>, val coinCount: Int, val collectIds: List<Any>, val email: String, val icon: String, val id: Int, val nickname: String, val password: String, val publicName: String, val token: String, val type: Int, val username: String )
5 Rxjava 线程切换
object RxThreadUtils { /** * Observable 切换到主线程 */ fun <T> observableToMain(): ObservableTransformer<T, T> { return ObservableTransformer { upstream -> upstream.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) } } }
6 请求 progress封装
object ShowD { private var Dailogs: Dialog? = null fun Show(con: Context) { Dailogs = Dialog(con) val attributes = Dailogs?.window?.attributes attributes?.width = WindowManager.LayoutParams.MATCH_PARENT attributes?.height = WindowManager.LayoutParams.MATCH_PARENT Dailogs?.window?.setGravity(Gravity.CENTER) Dailogs?.apply { setContentView(R.layout.dailog_layout) setCancelable(false) setCanceledOnTouchOutside(false) this }?.show() } fun cancel() { Dailogs?.dismiss() } }
7请求接口
interface Back<T> { fun onSuccess(data:T) fun onFailed(erro:String); }
8简单使用
RetrofitFactory.instance.sendRequset(this,RetrofitFactory.instance.getSevers(ApiNet::class.java).Logins(et_username.text.toString(),et_password.text.toString()),object :Back<BaseBen<LoginBen>>{ override fun onSuccess(data: BaseBen<LoginBen>) { } override fun onFailed(erro: String) { } })