-
基于okhttp封装的网络库。
-
简单配置就能进行网络请求。
-
Rx完美结合。
官网地址:https://square.github.io/retrofit/
-官方文档介绍一共三部 第一步 自建service 第二步创建请求,第三步使用请求
下面是基于。本项目中的使用...有点小小小长 但是是从base类开始的以后可以参考这个案例
直接集成到你的项目中
新建包 如果下面已经有该包了就直接使用就好
新建包 common\
新建 BaseConstant 下面需要改成自己的业务域名哈。我这是随便写了一个
package com.anguo.baselibary.common
class BaseConstant {
companion object{
val SERVER_ADDRESS="https://www.yzdyz.com"
}}
新建包 data/net
新建 RetrofitFactory
package com.anguo.baselibary.data.net
import com.anguo.baselibary.common.BaseConstant
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
class RetrofitFactory private constructor() {
companion object {
val instance: RetrofitFactory by lazy { RetrofitFactory() }
}
private val retrofit: Retrofit
private val interceptor: Interceptor
//初始化
init {
//通用拦截
interceptor = Interceptor { chain ->
val request = chain.request()
.newBuilder()
.addHeader("content-Type", "application/json")
.addHeader("charset", "utf-8")
.addHeader("appkey", BaseConstant.APP_KEY)
.build()
chain.proceed(request)
}
retrofit = Retrofit.Builder()
.baseUrl(BaseConstant.SERVER_ADDRESS)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(initClient())
.build()
}
private fun initClient(): OkHttpClient {
return OkHttpClient.Builder()
//日志拦截器
.addInterceptor(initLogIntercepter())
//请求拦截器
.addInterceptor(interceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.build()
}
private fun initLogIntercepter(): Interceptor {
val interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
return interceptor
}
fun <T> create(service: Class<T>): T {
return retrofit.create(service)
}
}
新建包/data/protocal
新建BaseResp
package com.anguo.baselibary.data.protocal
/*
能用响应对象
@status:响应状态码
@message:响应文字消息
@data:具体响应业务对象
*/
class BaseResp<out T> (val status:Int,val message:String,val data:T)
新建包rx
新建 BaseException 用来回调请求错误的信息
package com.anguo.baselibary.rx
class BaseException(val status:Int,val msg:String):Throwable() {
}
base中得完成了。。下面是实际业务中需要的逻辑
UserCenter 模块
新建包 service/impl
新建 UserServiceImpl
import com.anguo.baselibary.data.protocal.BaseResp
import com.anguo.baselibary.rx.BaseException
import com.anguo.user.repinsitory.UserRepository
import com.anguo.user.service.UserService
import rx.Observable
import rx.functions.Func1
class UserServiceImpl : UserService {
override fun register(email: String, userName: String,pwd: String): Observable<Boolean> {
val reponsitory = UserRepository()
return reponsitory.register(email, userName, pwd).flatMap(object :
Func1<BaseResp<String>, Observable<Boolean>> {
override fun call(t: BaseResp<String>?): Observable<Boolean> {
if (t != null) {
if (t.status != 0) {
return Observable.error(BaseException(t.status,t.message))
}
}
return Observable.just(true)
}
})
}
}
新建包 service
新建 UserService
package com.anguo.user.service
import rx.Observable
interface UserService {
fun register(moible: String, verifyCode: String, pwd: String):Observable<Boolean>
}
新建包 repinsitory
新建 UserRepository
package com.anguo.user.repinsitory
import com.anguo.baselibary.data.net.RetrofitFactory
import com.anguo.baselibary.data.protocal.BaseResp
import com.anguo.user.data.api.UserApi
import com.anguo.user.data.protocal.RegisterReq
import rx.Observable
class UserRepository {
fun register(email: String, userName: String,pwd: String): Observable<BaseResp<String>> {
return RetrofitFactory.instance.create(UserApi::class.java)
.register(RegisterReq(email,userName,pwd))
}
}
新建包 data/api/
新建 UserApi 这里对应到得RegisterReq
package com.anguo.user.data.api
import com.anguo.baselibary.data.protocal.BaseResp
import com.anguo.user.data.protocal.RegisterReq
import retrofit2.http.Body
import retrofit2.http.POST
import rx.Observable
interface UserApi {
@POST("login/register.php")
fun register(@Body req: RegisterReq):Observable<BaseResp<String>>
}
新建包 data/protocal
新建 RegisterReq
package com.anguo.user.data.protocal
data class RegisterReq(val email:String, val username:String, val password:String)
马上好。。还有两次呢个
新建 包 present/view
新建 RegisterView
package com.anguo.user.present.view
import com.anguo.baselibary.presenter.view.BaseView
interface RegisterView:BaseView {
fun onRegisterResult(result:Boolean){
}
}
新建包 present
新建 RegisterPersenter
package com.anguo.user.present
import UserServiceImpl
import com.anguo.baselibary.ext.execute
import com.anguo.baselibary.presenter.BasePresenter
import com.anguo.baselibary.rx.BaseSubscriber
import com.anguo.user.present.view.RegisterView
class RegisterPersenter : BasePresenter<RegisterView>() {
fun register(email: String, userName: String,pwd: String) {
/*业务逻辑*/
val userService=UserServiceImpl()
userService.register(email,userName,pwd)
.execute(object : BaseSubscriber<Boolean>(){
override fun onNext(t: Boolean) {
mView.onRegisterResult(t)
}
})
}
}
在实际的页面中
package com.anguo.user.ui.activity
import android.os.Bundle
import com.anguo.baselibary.ui.activity.BaseMvpActivity
import com.anguo.user.R
import com.anguo.user.present.RegisterPersenter
import com.anguo.user.present.view.RegisterView
import kotlinx.android.synthetic.main.activity_register.*
import org.jetbrains.anko.toast
class RegisterActivity : BaseMvpActivity<RegisterPersenter>(), RegisterView {
override fun onRegisterResult(result: Boolean) {
toast("注册成功")
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_register)
mPersenter = RegisterPersenter()
mPersenter.mView = this;
bt_ar_next.setOnClickListener {
// mPersenter.register(
// edArUsername.text.toString(),
// edEmail.text.toString(),
// edArPassword.text.toString()
// );
mPersenter.register(
"137709378222@qq.com",
"137709378222@qq.com",
"123456"
);
}
}
}
费劲啊。。。