Skip to content

Commit e068912

Browse files
committed
引入RxLifecycle防止rx的内存泄漏,通过扩展方法的方式对代码进行优化。
1 parent 1860db1 commit e068912

File tree

16 files changed

+166
-31
lines changed

16 files changed

+166
-31
lines changed

BaseLibrary/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,8 @@ dependencies {
5858
api "com.google.dagger:dagger:$dagger_version"
5959
kapt "com.google.dagger:dagger-compiler:$dagger_version"
6060

61+
//RxLifecycle
62+
api "com.trello:rxlifecycle-kotlin:$rx_lifecycle_version"
63+
api "com.trello:rxlifecycle-components:$rx_lifecycle_version"
64+
6165
}
Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package com.hyd.base.ext
22

3+
import android.view.View
4+
import com.hyd.base.data.protocal.BaseResp
5+
import com.hyd.base.rx.BaseFunc
6+
import com.hyd.base.rx.BaseFuncBoolean
37
import com.hyd.base.rx.BaseSubscribe
8+
import com.trello.rxlifecycle.LifecycleProvider
49
import rx.Observable
510
import rx.android.schedulers.AndroidSchedulers
611
import rx.schedulers.Schedulers
@@ -9,8 +14,25 @@ import rx.schedulers.Schedulers
914
* Created by hydCoder on 2019/7/16.
1015
* 以梦为马,明日天涯。
1116
*/
12-
fun <T> Observable<T>.execute(subscriber: BaseSubscribe<T>) {
17+
fun <T> Observable<T>.execute(subscriber: BaseSubscribe<T>, lifecycleProvider: LifecycleProvider<*>) {
1318
this.observeOn(AndroidSchedulers.mainThread())
19+
.compose(lifecycleProvider.bindToLifecycle())
1420
.subscribeOn(Schedulers.io())
1521
.subscribe(subscriber)
22+
}
23+
24+
fun <T> Observable<BaseResp<T>>.convert(): Observable<T> {
25+
return this.flatMap(BaseFunc())
26+
}
27+
28+
fun <T> Observable<BaseResp<T>>.convertBoolean(): Observable<Boolean> {
29+
return this.flatMap(BaseFuncBoolean())
30+
}
31+
32+
fun View.onClick(listener: View.OnClickListener) {
33+
this.setOnClickListener(listener)
34+
}
35+
36+
fun View.onClick(method: () -> Unit) {
37+
this.setOnClickListener { method }
1638
}
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package com.hyd.base.injection.component
22

33
import android.app.Activity
4+
import android.content.Context
45
import com.hyd.base.injection.ActivityScope
56
import com.hyd.base.injection.module.ActivityModule
7+
import com.hyd.base.injection.module.LifecycleProviderModule
8+
import com.trello.rxlifecycle.LifecycleProvider
69
import dagger.Component
710

811
/**
912
* Created by hydCoder on 2019/7/17.
1013
* 以梦为马,明日天涯。
1114
*/
1215
@ActivityScope
13-
@Component(dependencies = arrayOf(AppComponent::class), modules = arrayOf(ActivityModule::class))
16+
@Component(dependencies = arrayOf(AppComponent::class), modules = arrayOf(ActivityModule::class, LifecycleProviderModule::class))
1417
interface ActivityComponent {
15-
1618
fun activity(): Activity
19+
fun context() : Context
20+
fun lifecycleProvider(): LifecycleProvider<*>
1721
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.hyd.base.injection.module
2+
3+
import com.trello.rxlifecycle.LifecycleProvider
4+
import dagger.Module
5+
import dagger.Provides
6+
7+
/**
8+
* Created by hydCoder on 2019/7/17.
9+
* 以梦为马,明日天涯。
10+
*/
11+
@Module
12+
class LifecycleProviderModule(private val lifecycleProvider: LifecycleProvider<*>) {
13+
14+
@Provides
15+
fun providesLifecycleProvider(): LifecycleProvider<*> {
16+
return lifecycleProvider
17+
}
18+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package com.hyd.base.presenter
22

33
import com.hyd.base.presenter.view.BaseView
4+
import com.trello.rxlifecycle.LifecycleProvider
5+
import javax.inject.Inject
46

57
open class BasePresenter<T:BaseView> {
68
lateinit var mView: T
9+
10+
@Inject
11+
lateinit var lifecycleProvider: LifecycleProvider<*>
712
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.hyd.base.rx
2+
3+
import com.hyd.base.data.protocal.BaseResp
4+
import rx.Observable
5+
import rx.functions.Func1
6+
7+
/**
8+
* Created by hydCoder on 2019/7/18.
9+
* 以梦为马,明日天涯。
10+
*/
11+
class BaseFunc<T>: Func1<BaseResp<T>, Observable<T>> {
12+
override fun call(t: BaseResp<T>): Observable<T> {
13+
if (t.status != 0) {
14+
return Observable.error(BaseException(t.status, t.message))
15+
}
16+
return Observable.just(t.data)
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.hyd.base.rx
2+
3+
import com.hyd.base.data.protocal.BaseResp
4+
import rx.Observable
5+
import rx.functions.Func1
6+
7+
/**
8+
* Created by hydCoder on 2019/7/18.
9+
* 以梦为马,明日天涯。
10+
*/
11+
class BaseFuncBoolean<T>: Func1<BaseResp<T>, Observable<Boolean>> {
12+
override fun call(t: BaseResp<T>): Observable<Boolean> {
13+
if (t.status != 0) {
14+
return Observable.error(BaseException(t.status, t.message))
15+
}
16+
return Observable.just(true)
17+
}
18+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.hyd.base.ui.activity
22

3-
import android.support.v7.app.AppCompatActivity
3+
import com.trello.rxlifecycle.components.support.RxAppCompatActivity
44

5-
open class BaseActivity : AppCompatActivity(){
5+
open class BaseActivity : RxAppCompatActivity(){
66
}

BaseLibrary/src/main/java/com/hyd/base/ui/activity/BaseMvpActivity.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import com.hyd.base.common.BaseApplication
55
import com.hyd.base.injection.component.ActivityComponent
66
import com.hyd.base.injection.component.DaggerActivityComponent
77
import com.hyd.base.injection.module.ActivityModule
8+
import com.hyd.base.injection.module.LifecycleProviderModule
89
import com.hyd.base.presenter.BasePresenter
910
import com.hyd.base.presenter.view.BaseView
1011
import javax.inject.Inject
1112

12-
open class BaseMvpActivity<T:BasePresenter<*>>:BaseActivity(), BaseView{
13+
open abstract class BaseMvpActivity<T:BasePresenter<*>>:BaseActivity(), BaseView{
1314

1415
lateinit var activityComponent: ActivityComponent
1516

@@ -29,11 +30,14 @@ open class BaseMvpActivity<T:BasePresenter<*>>:BaseActivity(), BaseView{
2930
super.onCreate(savedInstanceState)
3031

3132
initActivityInjection()
33+
injectComponent()
3234
}
3335

3436
private fun initActivityInjection() {
3537
activityComponent = DaggerActivityComponent.builder().appComponent((application as BaseApplication).appComponent)
36-
.activityModule(ActivityModule(this)).build()
38+
.activityModule(ActivityModule(this)).lifecycleProviderModule(LifecycleProviderModule(this)).build()
3739
}
3840

41+
abstract fun injectComponent()
42+
3943
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.hyd.base.ui.fragment
2+
3+
import com.trello.rxlifecycle.components.support.RxFragment
4+
5+
open class BaseFragment : RxFragment(){
6+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.hyd.base.ui.fragment
2+
3+
import android.os.Bundle
4+
import com.hyd.base.common.BaseApplication
5+
import com.hyd.base.injection.component.ActivityComponent
6+
import com.hyd.base.injection.component.DaggerActivityComponent
7+
import com.hyd.base.injection.module.ActivityModule
8+
import com.hyd.base.injection.module.LifecycleProviderModule
9+
import com.hyd.base.presenter.BasePresenter
10+
import com.hyd.base.presenter.view.BaseView
11+
import javax.inject.Inject
12+
13+
open abstract class BaseMvpFragment<T:BasePresenter<*>>:BaseFragment(), BaseView{
14+
15+
lateinit var activityComponent: ActivityComponent
16+
17+
@Inject
18+
lateinit var mPresenter: T
19+
20+
override fun showLoading() {
21+
}
22+
23+
override fun hideLoading() {
24+
}
25+
26+
override fun onError() {
27+
}
28+
29+
override fun onCreate(savedInstanceState: Bundle?) {
30+
super.onCreate(savedInstanceState)
31+
32+
initActivityInjection()
33+
injectComponent()
34+
}
35+
36+
private fun initActivityInjection() {
37+
activityComponent = DaggerActivityComponent.builder().appComponent((activity?.application as BaseApplication).appComponent)
38+
.activityModule(ActivityModule(activity!!)).lifecycleProviderModule(LifecycleProviderModule(this)).build()
39+
}
40+
41+
abstract fun injectComponent()
42+
43+
}

UserCenter/src/main/java/com/hyd/user/presenter/RegisterPresenter.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ class RegisterPresenter @Inject constructor(): BasePresenter<RegisterView>() {
1717
userService.register(mobile, verifyCode, pwd)
1818
.execute(object : BaseSubscribe<Boolean>(){
1919
override fun onNext(t: Boolean) {
20-
mView.onRegisterResult(t)
20+
if (t)
21+
mView.onRegisterResult("注册成功")
2122
}
22-
})
23+
}, lifecycleProvider)
2324
}
2425
}

UserCenter/src/main/java/com/hyd/user/presenter/view/RegisterView.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ package com.hyd.user.presenter.view
33
import com.hyd.base.presenter.view.BaseView
44

55
interface RegisterView: BaseView {
6-
fun onRegisterResult(result:Boolean)
6+
fun onRegisterResult(result: String)
77
}
Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package com.hyd.user.service.impl
22

3-
import com.hyd.base.data.protocal.BaseResp
4-
import com.hyd.base.rx.BaseException
3+
import com.hyd.base.ext.convertBoolean
54
import com.hyd.user.data.repository.UserRepository
65
import com.hyd.user.service.UserService
76
import rx.Observable
8-
import rx.functions.Func1
97
import javax.inject.Inject
108

119
/**
@@ -19,13 +17,6 @@ class UserServiceImpl @Inject constructor(): UserService {
1917

2018
override fun register(mobile: String, verifyCode: String, pwd: String): Observable<Boolean> {
2119

22-
return repository.register(mobile, verifyCode, pwd).flatMap(object : Func1<BaseResp<String>, Observable<Boolean>>{
23-
override fun call(t: BaseResp<String>): Observable<Boolean> {
24-
if (t.status != 0) {
25-
return Observable.error(BaseException(t.status, t.message))
26-
}
27-
return Observable.just(true)
28-
}
29-
})
20+
return repository.register(mobile, verifyCode, pwd).convertBoolean()
3021
}
3122
}
Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.hyd.user.ui.activity
22

33
import android.os.Bundle
4+
import com.hyd.base.ext.onClick
45
import com.hyd.base.ui.activity.BaseMvpActivity
56
import com.hyd.user.R
67
import com.hyd.user.injection.component.DaggerUserComponent
@@ -12,23 +13,21 @@ import org.jetbrains.anko.toast
1213

1314
class RegisterActivity : BaseMvpActivity<RegisterPresenter>(), RegisterView {
1415

16+
override fun injectComponent() {
17+
DaggerUserComponent.builder().activityComponent(activityComponent).userModule(UserModule()).build().inject(this)
18+
mPresenter.mView = this
19+
}
20+
1521
override fun onCreate(savedInstanceState: Bundle?) {
1622
super.onCreate(savedInstanceState)
1723
setContentView(R.layout.activity_register)
1824

19-
initInjection()
20-
21-
mRegisterBtn.setOnClickListener {
25+
mRegisterBtn.onClick {
2226
mPresenter.register(mMobileEt.text.toString(),mVerifyCodeEt.text.toString(), mPwdEt.text.toString())
2327
}
2428
}
2529

26-
private fun initInjection() {
27-
DaggerUserComponent.builder().activityComponent(activityComponent).userModule(UserModule()).build().inject(this)
28-
mPresenter.mView = this
29-
}
30-
31-
override fun onRegisterResult(result: Boolean) {
32-
toast("注册成功")
30+
override fun onRegisterResult(result: String) {
31+
toast(result)
3332
}
3433
}

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ buildscript {
77
ext.ok_http_version = '3.4.1'
88
ext.retrofit_version = '2.4.0'
99
ext.dagger_version = '2.11'
10+
ext.rx_lifecycle_version = '1.0'
11+
1012
repositories {
1113
google()
1214
jcenter()

0 commit comments

Comments
 (0)