Android簡單封裝一個MVP基類流程詳解
對于MVP架構(gòu)我想大家都不陌生吧,對于現(xiàn)在的主流框架非MVP + RxJava + Retrofit莫屬了,GitHub上也有很多優(yōu)秀的開源項(xiàng)目對其進(jìn)行了很好的封裝。有時候看一些優(yōu)秀的開源項(xiàng)目是一種享受,但自己如果能從這里學(xué)到并實(shí)現(xiàn)一些自己想實(shí)現(xiàn)的需求我想那更是一種享受。這里很簡單的去實(shí)現(xiàn)一個MVP的基類,其它擴(kuò)展功能可以自行添加。
Model
public abstract class BaseModel {
}Presenter
public abstract class BasePresenter<M,V> {
public M mIModle;
public V mIView;
public void attachV(V v){
this.mIView = v;
if (mIModle == null) {
mIModle = createModel();
}
}
//當(dāng)View被銷毀掉時刪除Presenter層對View層的引用
public void detachV(){
mIView = null;
}
public abstract M createModel();
}View
public interface IBaseView {
}@SuppressLint("Registered")
public abstract class BaseMvpActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView{
public P mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mPresenter == null) {
mPresenter = createPresenter();
}
mPresenter.attachV(this);
}
//當(dāng)View被銷毀掉時刪除Presenter層對View層的引用
@Override
protected void onDestroy() {
super.onDestroy();
mPresenter.detachV();
}
public abstract P createPresenter();
}這里Mode和View的基類里什么都沒有,其實(shí)我們知道一般封裝基類的目錄是為了簡化項(xiàng)目代碼,提高開發(fā)效率。所以這里兩個基類里面一般根據(jù)我們自己需求去實(shí)現(xiàn)。
Example
public interface ExampleDataSource {
interface OnExampleFinishListener{
void loading();
void onSuccess();
void onError();
}
void load(OnExampleFinishListener listener);
}ExampleDataSource接口實(shí)現(xiàn)的是ExampleModel,而在它的內(nèi)部接口OnExampleFinishListener是Model層的回調(diào)接口,它們真正實(shí)現(xiàn)是在Presenter層。對于獲取到數(shù)據(jù)后(成功或失?。┚褪峭ㄟ^這個回調(diào)接口將數(shù)據(jù)傳遞Presenter層。
public class ExampleModel extends BaseModel implements ExampleDataSource {
/**
* model層主要用來進(jìn)行數(shù)據(jù)存儲操作,例如:數(shù)據(jù)讀寫和網(wǎng)絡(luò)請求。
* 這里進(jìn)行下模擬耗時操作
* @param listener
*/
@Override
public void load(final OnExampleFinishListener listener) {
//加載中狀態(tài)
listener.loading();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//獲取成功后進(jìn)行回調(diào)
listener.onSuccess();
}
},2000);
}
}這里我們在Model層模擬下耗時操作(例如:網(wǎng)絡(luò)請求),然后將得到的數(shù)據(jù)結(jié)果通過回調(diào)方法傳遞到Presenter層。
public interface ExampleContract extends IBaseView {
interface ExamplePresent {
void loadData();
}
interface ExampleView {
void loadResult(String result);
void showLoading();
void loadFinish();
}
}這里我們將Presenter接口和View接口放在一個類中,這樣可以使我們能夠清晰的看到在Presenter層和View層中有哪些功能,方便我們以后維護(hù)。
public class ExamplePresenter extends BasePresenter<ExampleModel,ExampleContract.ExampleView> implements ExampleContract.ExamplePresent,ExampleDataSource.OnExampleFinishListener{
@Override
public void loadData() {
mIModle.load(this);
}
@Override
public void loading() {
mIView.showLoading();
}
@Override
public void onSuccess() {
mIView.loadResult("成功");
mIView.loadFinish();
}
@Override
public void onError() {
}
@Override
public ExampleModel createModel() {
return new ExampleModel();
}
}從Presenter層我們可以看出,首先調(diào)用Model層的接口獲取數(shù)據(jù)進(jìn)行一些邏輯操作然后通過View層接口實(shí)現(xiàn)數(shù)據(jù)的展示。
public class MainActivity extends BaseMvpActivity<ExamplePresenter> implements ExampleContract.ExampleView {
private TextView tvName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvName = findViewById(R.id.tv_name);
//加載數(shù)據(jù)
mPresenter.loadData();
}
@Override
public ExamplePresenter createPresenter() {
return new ExamplePresenter();
}
//返會數(shù)據(jù)結(jié)果
@Override
public void loadResult(String result) {
tvName.setText(result);
}
//加載過程
@Override
public void showLoading() {
tvName.setText("正在加載,請稍等。。。");
}
//加載結(jié)束
@Override
public void loadFinish() {
}
}嗯,好了!一個很簡單的MVP基類就實(shí)現(xiàn)了,對于使用輪子來說,我們更應(yīng)該試著一點(diǎn)點(diǎn)自己去實(shí)現(xiàn)它,從簡單到復(fù)雜。慢慢就會更加的了解它。貼上項(xiàng)目源碼更參考。
到此這篇關(guān)于Android簡單封裝一個MVP基類流程詳解的文章就介紹到這了,更多相關(guān)Android封裝MVP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android Binder進(jìn)程間通信工具AIDL使用示例深入分析
Binder作為Android 眾多的IPC通訊手段之一,在Framework的數(shù)據(jù)傳輸中起到極為關(guān)鍵的作用。Binder機(jī)制可謂是Android 知識體系里的重中之重,作為偏底層的基礎(chǔ)組件,平時我們很少關(guān)注它,而它卻是無處不在,也是Android 面試易考察的點(diǎn)之一2022-11-11
Android仿網(wǎng)易嚴(yán)選底部彈出菜單效果
這篇文章主要為大家詳細(xì)介紹了Android仿網(wǎng)易嚴(yán)選底部彈出菜單效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
Android金額輸入框只允許輸入小數(shù)點(diǎn)后兩位效果
實(shí)現(xiàn)android 金額輸入框輸入小數(shù)點(diǎn)后兩位的效果也不是很復(fù)雜,只需要設(shè)置輸入框輸入的字符類型、設(shè)置InputFilter、設(shè)置輸入變化監(jiān)聽即可。這篇文章主要介紹了Android金額輸入框只允許輸入小數(shù)點(diǎn)后兩位 ,需要的朋友可以參考下2017-05-05
Android Studio實(shí)現(xiàn)進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-04-04
Android編程基礎(chǔ)之獲取手機(jī)屏幕大小(DisplayMetrics應(yīng)用)示例
這篇文章主要介紹了Android獲取手機(jī)屏幕大小的方法,結(jié)合實(shí)例形式分析了TextView ,Button ,以及DisplayMetrics的使用方法,并重點(diǎn)分析了DisplayMetrics的應(yīng)用技巧,需要的朋友可以參考下2016-10-10
Android ListView的Item點(diǎn)擊效果的定制
這篇文章主要介紹了Android ListView的Item點(diǎn)擊效果的定制的相關(guān)資料,需要的朋友可以參考下2017-07-07
android實(shí)現(xiàn)讀取、搜索聯(lián)系人的代碼
本文給大家分享的是在安卓系統(tǒng)中實(shí)現(xiàn)讀取搜索聯(lián)系人的代碼,非常的實(shí)用,想學(xué)習(xí)安卓開發(fā)的小伙伴一定不要錯過。2015-03-03

