学习笔记,初对Android studio的MVP模式的理解,附带demo
以下为本人学习笔记。
MVP模式,字如其名。代表Model Presenter View ,即模型,接口,视图。由MVC的Controller和Model和View组成,但代码多起来时,不适合调用,Controller是不适合调用模型的。所以引入MVP模式,使用接口之后就可以将Model和View分开,使程序修改时可以,只动Model或者View或Presenter。
接下来是demo来解释这个MVP模式;
首先要用到jar包导入
implementation 'com.loopj.android:android-async-http:1.4.9'
之后是截图
首先是View:它不像MVC模式是将Activity归为Controller。
interface MainView
public interface MainView { void showData(MainModelBean mainModelBean); void showProgress(); void hideProgress(); }
MainActivity实现ManView接口
public class MainActivity extends AppCompatActivity implements MainView { private ProgressBar mProgressBar; private TextView text; private MainPresenter mMainPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { text = (TextView) findViewById(R.id.text); mProgressBar = (ProgressBar) findViewById(R.id.mProgressBar); mMainPresenter = new MainPresenter(this); //制造延迟效果 new Handler().postDelayed(new Runnable() { @Override public void run() { mMainPresenter.loadData(); } }, 2000); } @Override protected void onDestroy() { mMainPresenter.detachView(); super.onDestroy(); } @Override public void showData(MainModelBean mainModelBean) { String showData = getResources().getString(R.string.city) + mainModelBean.getCity() + getResources().getString(R.string.wd) + mainModelBean.getWd() + getResources().getString(R.string.ws) + mainModelBean.getWs() + getResources().getString(R.string.time) + mainModelBean.getTime(); text.setText(showData); } @Override public void showProgress() { mProgressBar.setVisibility(View.VISIBLE); } @Override public void hideProgress() { mProgressBar.setVisibility(View.GONE); } }
Presenter:
interface IMainPresenter:
public interface IMainPresenter { void loadDataSuccess(MainModelBean mainModelBean); void loadDataFailure(); }
interface Presenter<V>
public interface Presenter<V> { void attachView(V view); void detachView(); }
MainPresenter类:
public class MainPresenter implements Presenter<MainView>, IMainPresenter { private MainView mMainView; private MainModel mMainModel; public MainPresenter(MainView view) { attachView(view); mMainModel = new MainModel(this); } @Override public void attachView(MainView view) { this.mMainView = view; } @Override public void detachView() { this.mMainView = null; } public void loadData() { mMainView.showProgress(); mMainModel.loadData(); } @Override public void loadDataSuccess(MainModelBean mainModelBean) { mMainView.showData(mainModelBean); mMainView.hideProgress(); } @Override public void loadDataFailure() { mMainView.hideProgress(); } }
最后是Model类:
public class MainModel { IMainPresenter mIMainPresenter; public MainModel(IMainPresenter iMainPresenter) { this.mIMainPresenter = iMainPresenter; } public void loadData() { AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); asyncHttpClient.get("http://www.weather.com.cn/adat/sk/101010100.html", new JsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { super.onSuccess(statusCode, headers, response); try { MainModelBean mainModelBean = new MainModelBean(); JSONObject weatherinfo = response.getJSONObject("weatherinfo"); mainModelBean.setCity(weatherinfo.getString("city")); mainModelBean.setWd(weatherinfo.getString("WD")); mainModelBean.setWs(weatherinfo.getString("WS")); mainModelBean.setTime(weatherinfo.getString("time")); mIMainPresenter.loadDataSuccess(mainModelBean); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); mIMainPresenter.loadDataFailure(); } }); } }
MainModeleBean类
public class MainModelBean { private String city; private String wd; private String ws; private String time; //此处省略get和set方法 public String getCity() { return city; } public String getTime() { return time; } public String getWd() { return wd; } public String getWs() { return ws; } public void setWs(String ws) { this.ws = ws; } public void setTime(String time) { this.time = time; } public void setCity(String city) { this.city = city; } public void setWd(String wd) { this.wd = wd; } }
以上就是程序全部,需要解释的是视图相当与MainActivity,Presenter相当于MainPresenter,Model相当于MainModel。
然后是用到了AsyncHttpClient来获取网站的返回数据。
//制造延迟效果 new Handler().postDelayed(new Runnable() { @Override public void run() { mMainPresenter.loadData(); } }, 2000);延迟跳转。