前言
kotlin系統(tǒng)學習:http://www.reibang.com/u/5509a21c1623
retrofit學習:http://www.reibang.com/p/3e13e5d34531
rxjava學習:http://www.reibang.com/p/464fa025229e
mvp學習:http://blog.csdn.net/lmj623565791/article/details/46596109
Kotlin+Retrofit+RxJava+MVP封裝(二)
Kotlin+Retrofit+RxJava+MVP封裝(三)
MVP簡介
我們可以對mvp進行一個簡單的理解拖吼,mvp分別為:
model:處理業(yè)務邏輯
view:展示視圖
presenter:中間人(綁定view和model)
那么view和presenter之間是通過接口進行交互丽啡,這樣能夠降低耦合,方便進行單元測試血筑。
實現(xiàn)一個簡單的登錄demo
我們先看一下目錄結(jié)構(gòu):
需要導入的第三方庫:
/*網(wǎng)絡依賴*/
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1'
/*rxjava*/
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
/*圖片處理(glide)*/
compile 'com.github.bumptech.glide:glide:3.7.0'
view interface及activity實現(xiàn)
使用kotlin創(chuàng)建interface和activity
如大多數(shù)登錄界面所示婉支,在登錄時我們需要輸入用戶名和密碼春宣,以及點擊登錄按鈕過后的一個監(jiān)聽回調(diào)纫骑,所以在寫接口時我們需要三樣東西:
interface LoginView :BaseView{
fun getUserName(): String//獲取用戶名
fun getPassWord(): String//獲取密碼
fun LoginSuccess(baseBean: BaseBean)//登錄成功
fun LoginFailed(baseBean: BaseBean)//登錄失敗
}
我們在activity中實現(xiàn)以上接口,對界面做出相應操作:
override fun getUserName(): String {
return "test"
}
override fun getPassWord(): String {
return "111111"
}
override fun LoginSuccess(baseBean: BaseBean) {
LoadingDis()
openActivity(MoneyDetailActivity::class.java)
Toast.makeText(this,"成功"+baseBean.message,Toast.LENGTH_SHORT).show()
}
override fun LoginFailed(baseBean: BaseBean) {
LoadingDis()
Toast.makeText(this,"失敗"+baseBean.message,Toast.LENGTH_SHORT).show()
}
以上澄暮,我們創(chuàng)建完了對應的activity以及接口名段,相應的我們需要去處理邏輯的Model以及把model和view相關聯(lián)的presenter。
Model實現(xiàn)
因為model是邏輯處理的赏寇,所以在登錄時需要做出登錄的邏輯操作和登錄過后的返回動作吉嫩,
interface LoginModel {
//登錄
fun Login(username:String,password:String)
/ /登錄完成過后的接口
fun LoadComplete(onLoginListener: OnLoginListener)
interface OnLoginListener{
fun LoginSuccess(baseBean: BaseBean)
fun LoginFailed(baseBean: BaseBean)
}
}
然后我們寫好相對應的實現(xiàn)類,實現(xiàn)上面的接口嗅定,進行一個具體的操作:
class LoginModeImpl: LoginModel, BaseModel<BaseBean>() {
//取到RetrofitManager中的service
override fun ServiceParams(params: HashMap<String, String>): Observable<BaseBean> {
return RetrofitManager.builder().service!!.getRegisterList(params)
}
//var mOnLoginListenr:LoginPresenter.onLoginListener?=null
var mOnLoginListener: LoginModel.OnLoginListener?=null
var mUserName:String?=null
var mPassWord:String?=null
//失敗過后的操作
override fun FailedOperation(e: Throwable?) {
}
//聲明監(jiān)聽接口
override fun LoadComplete(onLoginListener: LoginModel.OnLoginListener) {
if(mOnLoginListener==null){
mOnLoginListener=onLoginListener
}
}
//登錄成功過后的操作
override fun SuccessOperation(o: BaseBean) {
// val message = o.message
if(o.success){
mOnLoginListener!!.LoginSuccess(o)
}else{
mOnLoginListener!!.LoginFailed(o)
}
}
//需要傳入的參數(shù)
override fun Params(): HashMap<String, String>? {
ClearHashMap()
mParams!!.put("username",mUserName!!)
mParams!!.put("password",mPassWord!!)
return mParams
}
//進行的登錄操作
override fun Login(username: String, password: String) {
mUserName=username
mPassWord=password
PostParams()
}
}
因為我對Model進行了一個簡單的封裝自娩,可能有點看不懂,我把basemodel的代碼也貼出來渠退,這樣便于理解:
abstract class BaseModel <T:BaseBean>{
//需要傳入的參數(shù)
var mParams:HashMap<String,String>?=HashMap()
//進行數(shù)據(jù)請求
open fun PostParams(){
ServiceParams(Params()!!)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe (object : Subscriber<BaseBean>() {
override fun onCompleted() {
Completed()
}
override fun onError(e: Throwable?) {
FailedOperation(e)
}
override fun onNext(o: BaseBean) {
// val message = o.message
//mOnLoginListenr?.LoginSuccess()
SuccessOperation(o)
}
})
}
open fun Completed() {
}
abstract fun FailedOperation(e: Throwable?)
abstract fun SuccessOperation(o: BaseBean)
abstract fun Params(): HashMap<String, String>?
//得到rxjava中的Observable
abstract fun ServiceParams(params: HashMap<String, String>): Observable<T>
open fun ClearHashMap(){
if (mParams!!.size>0)
mParams!!.clear()
}
}
到此忙迁,我們的view和model都已經(jīng)實現(xiàn)了,那么就得通過presenter來進行綁定碎乃、交互了姊扔。
Presenter實現(xiàn)
presenter來綁定view和model,那么顯然梅誓,presenter將持有view和model的一個對象恰梢,比較簡單佛南,直接貼代碼:
class LoginPresenterxx(val loginView: LoginView): BasePresenter<LoginView>() {
var loginmode:LoginModel?=null
init {
loginmode= LoginModeImpl()
}
fun Login(username: String, password: String){
loginmode!!.Login(username,password)
loginmode!!.LoadComplete(object : LoginModel.OnLoginListener {
override fun LoginSuccess(baseBean: BaseBean) {
loginView.LoginSuccess(baseBean)
}
override fun LoginFailed(baseBean: BaseBean) {
loginView.LoginFailed(baseBean)
}
})
}
}
至此,關于mvp的一部分差不多就這些了嵌言,小結(jié)一哈:
1.首先對應功能需求實現(xiàn)view就對應的activity嗅回;
2.對應邏輯需求實現(xiàn)Model和ModelImpl;
3.通過各自接口,實現(xiàn)presenter摧茴,實現(xiàn)model和view的交互绵载。
Retrofit+RxJava實現(xiàn)
//retrofit的一個初始化
initOkHttpclient()
var retrofit = Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.client(mOkHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
service = retrofit.create(RetrofitService::class.java)
//對okhttp的一個初始化
fun initOkHttpclient() {
//log信息攔截器
val interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
if (mOkHttpClient == null) {
mOkHttpClient = OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.addNetworkInterceptor(this)
.addInterceptor(this)
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(10000L, TimeUnit.MILLISECONDS)//讀操作超時時間
.cookieJar(CookiesManager())//設置長久存在的cookie
.build()
}
}
//定義的接口類
interface RetrofitService {
//登錄
@FormUrlEncoded
@POST("/app/common/login.html")
fun getRegisterList(@FieldMap params: HashMap<String, String>): Observable<BaseBean>
}
//通過rxjava處理線程切換
ServiceParams(Params()!!)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe (object : Subscriber<BaseBean>() {
override fun onCompleted() {
Completed()
}
override fun onError(e: Throwable?) {
FailedOperation(e)
}
override fun onNext(o: BaseBean) {
// val message = o.message
//mOnLoginListenr?.LoginSuccess()
SuccessOperation(o)
}
})
小結(jié):
1.創(chuàng)建一個Retrofit;
2.創(chuàng)建接口,通過Retrofit獲取實例苛白;
3.結(jié)合Rxjava娃豹,實現(xiàn)線程切換,邏輯更加流暢购裙。
總結(jié)
在這篇文章中懂版,是對Kotlin+Retrofit+RxJava+MVP的一個簡單實現(xiàn),如果需要補基礎的話可以借鑒前言的博客或者簡書缓窜。這篇簡書沒有相對應的源碼定续,因為后續(xù)會在這篇文章的基礎上對源碼進行封裝以及Recyclerview的實現(xiàn)和封裝,待續(xù)......