简单的Mvp设计

任务:从网络上获取数据,而后显示在MainActivity的ListView上html

1、载入须要用的框架

一、Mvp框架java

compile 'com.hannesdorfmann.mosby:mvp:2.0.1'react

compile 'com.hannesdorfmann.mosby:viewstate:2.0.1'android

二、Retrofit和RxJava框架json

compile 'io.reactivex:rxandroid:1.2.0'
compile 'io.reactivex:rxjava:1.1.5'
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'设计模式

2、设计草图api

根据Mvp设计模式:网络

将提供数据的网络请求,放入model包中。框架

将显示屏幕数据的类,放入View包中ide

将处理数据和转换的逻辑,放入Presents包中。

咱们这里:只须要实现当获取到数据时候,ListView的显示状况就能够了。

3、开工

一、建立Retrofit的网络请求   Retrofit的使用  放到Model这个包下面

public class ArticleEntity{
   //将json数据转换为实体类
    private String title;
    private String detail;

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
ArticleEntity
public interface DataApi {
//发送数据请求
    @GET("refreshlayout/api/newdata{pageNumber}.json")
    Observable<List<ArticleEntity>> getArticles(@Path("pageNumber") int pageNumber);
}
DataApi

最后:建立

public class HttpConnection {
    //地址:从网上找的
    private static final String BASE_URL = "http://7xk9dj.com1.z0.glb.clouddn.com/";
    private static HttpConnection mHttConnection;
    private Retrofit mRetrofit;
    //建立Retrofit
    private HttpConnection(){
        mRetrofit = new Retrofit.Builder()
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(BASE_URL)
                .build();
    }
    //使用单例模式,加上双层锁
    public static synchronized HttpConnection newInstace(){
        if (mHttConnection == null){
            synchronized (HttpConnection.class){
                mHttConnection = new HttpConnection();
            }
        }
        return mHttConnection;
    }
    //获取数据的方法,将subscriber做为回调接口
    public void getData(int pageNum,Subscriber subscriber){
        DataApi api = mRetrofit.create(DataApi.class);
        Observable observable = api.getArticles(pageNum);
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber);
    }
}
httpConnection

二、建立View

分析:根据咱们的需求,咱们只须要屏幕显示数据这一个动做就能够了,因此咱们设计的View是这样的

//实现:建立接口并继承接口MvpView
public interface IArticleView extends MvpView{
    //获取到数据,显示
    void show(ArrayList<ArticleEntity> articleItem);
}
IArticle

三、设计Present类

一样,咱们也只须要显示方法就能够了

public class ArticlePresent extends MvpBasePresenter<IArticleView> {
    private int mViewPage = 0;
    private HttpConnection mConnection;
    @Override
    public void attachView(IArticleView view) {
        super.attachView(view);
        mConnection = HttpConnection.newInstace();
    }
    //获取数据,并处理,而后传递给View的中转站
    public void show(){
        //获取上步骤的View
        final IArticleView view = getView();
        if (view != null){
            Subscriber subscriber = new Subscriber() {
                @Override
                public void onCompleted() {
                    Log.d("MainActivity","完成了");
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(Object o) {
                    //当获取到了数据,就调用View的方法
                    view.show((ArrayList<ArticleEntity>)o);
                }
            };
            //获取相关数据
            mConnection.getData(mViewPage,subscriber);
        }
    }

}
ArticlePresnt

四、MainActivity显示数据

BaseMvpActivity  继承MvpBaseActivity 设计了一个基础封装方法,封装了一些基础方法,

泛型:是在类名后建立的        泛型是在方法的返回值前建立的

public abstract class BaseMvpActivity <V extends MvpView,T extends MvpPresenter<V>>extends MvpActivity<V,T> {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView(savedInstanceState);
        setListener();
    }

    public abstract void initView(Bundle savedInstanceState);

    public abstract void setListener();

    public <VT extends View> VT getViewById(int id){
        return (VT) findViewById(id);
    }
}
BaseMvpActivity
public class MainActivity extends BaseMvpActivity<IArticleView,ArticlePresent> implements IArticleView{
    private ListView mListView;
    private ArticleAdapter mArticleAdapter;
    @NonNull
    @Override
    public ArticlePresent createPresenter() {
        return new ArticlePresent();
    }

    @Override
    public void initView(Bundle savedInstanceState) {
        mListView = getViewById(R.id.main_listView);
        mArticleAdapter = new ArticleAdapter(this,new ArrayList<ArticleEntity>());
        mListView.setAdapter(mArticleAdapter);
    }

    @Override
    public void setListener() {

    }

    @Override
    public void show(ArrayList<ArticleEntity> articleItem) {
        mArticleAdapter.addArticles(articleItem);
    }
}
MainActivity

步骤:继承BaseMvpActivity,继承刚才的IAcrticle接口

 

设计方式:将获取数据的类装入model中,而后指定View显示的接口方法(好比说:没数据时候显示什么界面,有数据的时候显示什么界面,里面的数据是否是不同了)

在Present完成处理数据和根据不一样数据调用View方法的逻辑。

相关文章
相关标签/搜索