簡化的mvp架構:FinalMvp
FinalMvp
mvp模式介紹
由圖可見,mvp模式將分為View、presenter、model,而presenter將連接View和model, view和model之間不允許直接交互. 將view和model完全隔絕,可以說完全解決了耦合性的問題。 道理很容易理解,可是要想真正做好卻不那么容易!
finaMvp介紹
finalMvp是為了輕松使用mvp模式開發,并且規范mvp代碼而編寫的框架。 該框架的結構為:BaseView BasePresenter BaseModel 代碼中直接繼承這三類,變可以輕松實現mvp分層 finalMvp架構模型圖:![]()
代碼實現
1、activity繼承BaseView
onDataChanage()//當數據變化時通知此方法
onChanageUi()//presenter可以直接發送修改ui指令,在onChangeUi接收
編輯數據字段加上注解@ViewData,presenter會使用依賴注入修改數據
2、編輯presenter繼承BasePresenter
initModel()//初始化model
onModelCallBack//數據返回后的監聽
執行loadData()//請求數據,會發送到model的loadData
執行setDataChanage(data)//將view中標注@ViewData的數據值修改為data,并通知view改變ui
3、編輯model繼承BaseModel
loadData(tag,msg)//加載數據
chanageData(tag,data)//數據加載完成后調用這個方法 demo代碼
Activity編輯實現BaseView
public class MainActivity extends Activity implements BaseView{
private MainPresenter preseneter;
private TextView tv;
/**
* ViewData便是數據源注解,通過此注解可以自動修改值
*/
@ViewData
public String data="aaaaaaaaaaaaaaaaaaaaaaa";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
preseneter=new MainPresenter(this);
tv=new TextView(this);
setContentView(tv);
tv.setText(data);
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
preseneter.chanageTextView();
}
});
}
@Override
public void onDataChanage() {
tv.setText(data);
}
@Override
public void onChanageUi(int tag) {
}
} MainPresenter繼承BasePresenter
public class MainPresenter extends BasePresenter{
private final int TAG_LOAD_DATA=1;
public MainPresenter(BaseView view) {
super(view);
}
public void chanageTextView(){
loadData(TAG_LOAD_DATA, "http://xxxxx");
}
/**
* 初始化model
*/
@Override
public BaseModel initModel() {
return new MainModel();
}
@Override
public void onModelCallBack(int tag, Object obj) {
switch (tag) {
case TAG_LOAD_DATA:
/**
* 執行setDataChange,代碼便會將BaseView中的注解的值替換為obj,
* 并執行BaseView下的onDataChanage方法,通知BaseView修改ui
*/
setDataChanage(obj);
break;
}
}
} MainModel繼承BaseModel
public class MainModel extends BaseModel{
@Override
public void loadData(final int tag, String msg) {
new Thread(){
public void run() {
//執行耗時操作,如執行http請求,從sqlite中讀取或計算數據
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//返回得到計算后的數據,將數據返回
chanageData(tag, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
};
}.start();
}
} 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
