Android簡單封裝一個MVP基類流程詳解
對于MVP架構我想大家都不陌生吧,對于現在的主流框架非MVP + RxJava + Retrofit莫屬了,GitHub上也有很多優(yōu)秀的開源項目對其進行了很好的封裝。有時候看一些優(yōu)秀的開源項目是一種享受,但自己如果能從這里學到并實現一些自己想實現的需求我想那更是一種享受。這里很簡單的去實現一個MVP的基類,其它擴展功能可以自行添加。
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();
}
}
//當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);
}
//當View被銷毀掉時刪除Presenter層對View層的引用
@Override
protected void onDestroy() {
super.onDestroy();
mPresenter.detachV();
}
public abstract P createPresenter();
}這里Mode和View的基類里什么都沒有,其實我們知道一般封裝基類的目錄是為了簡化項目代碼,提高開發(fā)效率。所以這里兩個基類里面一般根據我們自己需求去實現。
Example
public interface ExampleDataSource {
interface OnExampleFinishListener{
void loading();
void onSuccess();
void onError();
}
void load(OnExampleFinishListener listener);
}ExampleDataSource接口實現的是ExampleModel,而在它的內部接口OnExampleFinishListener是Model層的回調接口,它們真正實現是在Presenter層。對于獲取到數據后(成功或失?。┚褪峭ㄟ^這個回調接口將數據傳遞Presenter層。
public class ExampleModel extends BaseModel implements ExampleDataSource {
/**
* model層主要用來進行數據存儲操作,例如:數據讀寫和網絡請求。
* 這里進行下模擬耗時操作
* @param listener
*/
@Override
public void load(final OnExampleFinishListener listener) {
//加載中狀態(tài)
listener.loading();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//獲取成功后進行回調
listener.onSuccess();
}
},2000);
}
}這里我們在Model層模擬下耗時操作(例如:網絡請求),然后將得到的數據結果通過回調方法傳遞到Presenter層。
public interface ExampleContract extends IBaseView {
interface ExamplePresent {
void loadData();
}
interface ExampleView {
void loadResult(String result);
void showLoading();
void loadFinish();
}
}這里我們將Presenter接口和View接口放在一個類中,這樣可以使我們能夠清晰的看到在Presenter層和View層中有哪些功能,方便我們以后維護。
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層我們可以看出,首先調用Model層的接口獲取數據進行一些邏輯操作然后通過View層接口實現數據的展示。
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);
//加載數據
mPresenter.loadData();
}
@Override
public ExamplePresenter createPresenter() {
return new ExamplePresenter();
}
//返會數據結果
@Override
public void loadResult(String result) {
tvName.setText(result);
}
//加載過程
@Override
public void showLoading() {
tvName.setText("正在加載,請稍等。。。");
}
//加載結束
@Override
public void loadFinish() {
}
}嗯,好了!一個很簡單的MVP基類就實現了,對于使用輪子來說,我們更應該試著一點點自己去實現它,從簡單到復雜。慢慢就會更加的了解它。貼上項目源碼更參考。
到此這篇關于Android簡單封裝一個MVP基類流程詳解的文章就介紹到這了,更多相關Android封裝MVP內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android開發(fā)導入項目報錯Ignoring InnerClasses attribute for an anonym
今天小編就為大家分享一篇關于Android開發(fā)導入項目報錯Ignoring InnerClasses attribute for an anonymous inner class的解決辦法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
Android中監(jiān)聽判斷網絡連接狀態(tài)的方法
這篇文章主要介紹了Android中監(jiān)聽判斷網絡連接狀態(tài)的方法,介紹了是否有網絡連接判斷、連接的類型和監(jiān)聽網絡狀態(tài)的方法,需要的朋友可以參考下2014-06-06
Android Secret Code(輸入字符彈出手機信息)詳解
這篇文章主要介紹了Android Secret Code(輸入字符彈出手機信息)詳解的相關資料,需要的朋友可以參考下2016-11-11

