学习笔记,初对Android studio的MVP模式的理解,附带demo

以下为本人学习笔记。


学习笔记,初对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'

之后是截图

学习笔记,初对Android studio的MVP模式的理解,附带demo

首先是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;
    //此处省略getset方法


    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);
延迟跳转。