ilovewqf 2020-02-01
ReadHub项目Kotlin版转换指南(二、数据库和网络请求)
Android 开发中的 MVP 架构相信大家都已经熟悉,不熟悉的请右转 Google,ReadHub 项目从 Java 转换成 Kotlin 过程中,我们需要一套新的架构方式来实现(Kotlin 项目中没有使用 dagger2)。
base 为 MVP 架构的基础部分,user 为其具体使用过程。
interface BaseContract { interface IView { fun showLoading() fun hideLoading() } interface IPresenter<V : IView> { fun getView(): V } }
BaseContract
中定义了两个接口 IView
和 IPresenter
,
IView
接口中定义了 Loading
的操作,使其可以在每个 View
中使用,如果你的项目中有一些需要在大多数 View
中用到的函数,也可定义在此接口中。
IPresenter 中声明一个泛型 V
继承自 IView
,通过 getView
函数可以获取到该变量,用来回调 Model 中的结果给 View
。
abstract class BaseActivity<P : BaseContract.IPresenter<*>> : AppCompatActivity(), BaseContract.IView { private var mKProgressHUD: KProgressHUD? = null protected lateinit var mPresenter: P override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val layoutId = getLayoutId() setContentView(layoutId) initView() initData() } protected abstract fun getLayoutId(): Int protected abstract fun initView() protected abstract fun initData() override fun showLoading() { mKProgressHUD = KProgressHUD.create(this) mKProgressHUD?.setStyle(KProgressHUD.Style.SPIN_INDETERMINATE) ?.setCancellable(true) ?.setAnimationSpeed(2) ?.setDimAmount(0.5f) ?.show() } override fun hideLoading() { mKProgressHUD?.dismiss() } }
abstract class BaseFragment<P : BaseContract.IPresenter<*>> : Fragment(), BaseContract.IView { private var mRootView: View? = null private var mKProgressHUD: KProgressHUD? = null protected lateinit var mPresenter: P override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { inflaterView(inflater, container) return mRootView } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) initView(mRootView) initData大专栏 ReadHub项目Kotlin版开发指南(三、MVP架构)n class="p">() } /** * 设置View * * @param inflater * @param container */ private fun inflaterView(inflater: LayoutInflater, @Nullable container: ViewGroup?) { if (mRootView == null) { mRootView = inflater.inflate(getLayoutId(), null) } } protected abstract fun getLayoutId(): Int protected abstract fun initView(view: View?) protected abstract fun initData() override fun showLoading() { mKProgressHUD = KProgressHUD.create(activity) mKProgressHUD?.setStyle(KProgressHUD.Style.SPIN_INDETERMINATE) ?.setCancellable(true) ?.setAnimationSpeed(2) ?.setDimAmount(0.5f) ?.show() } override fun hideLoading() { mKProgressHUD?.dismiss() } }
BaseActivity
中声明泛型 P
继承自 BaseContract.IPresenter
,变量 mPresenter
声明类型 P
并且延迟初始化(在子类中初始化)。
BaseActivity
继承 BaseContract.IView
,重写回调方法,如 hideLoading、showLoading
。
interface NewsContract { interface View : BaseContract.IView { fun updateTechNews(publishDate: String, newsMos: ArrayList<NewsMo>) } interface Presenter : BaseContract.IPresenter<View> { fun getTechNews(publishDate: String) } }
class NewsPresenter(var mView: BaseContract.IView) : NewsContract.Presenter { override fun getView(): NewsContract.View { return mView as NewsContract.View } override fun getTechNews(publishDate: String) { LogUtils.i("apiTachNews === ") App.sInstance.apiService(ReadhubApiService::class.java) ?.apiTeachNews(publishDate, Constant.NEWS_PAGE_SIZE) ?.compose(RxSchedulers.io_main()) ?.subscribe( { getView()?.updateTechNews(publishDate, it.data!!) }, { LogUtils.e("apiTeachNews error == ${it}") }) } }
getView
获取 IView
对象的实现。
class NewsFragment : BaseFragment<NewsPresenter>(), NewsContract.View { override fun getLayoutId(): Int { return R.layout.fragment_news } override fun initView(view: View?) { } override fun initData() { mPresenter = NewsPresenter(this) mPresenter?.getTechNews("") } override fun updateTechNews(publishDate: String, newsMos: ArrayList<NewsMo>) {} }
构造 mPresenter
对象,获取 Model
中的数据。