MVP个人理解

从Google推出官方MVP架构demo到现在大概有一年多的时间了,半年前大概在所有的Android技术社区都有提到MVP架构,现在关于MVP架构的话题似乎没有以前那么多了,可能是因为大家都已经能够熟练的使用MVP了。在这里先炒碗闲饭,提供了一个快速生成MVP模式的插件。地址


对应的model层

public interface ApiService {
    @GET("type/1/p/1")
    Observable<Bean> geturl();
}

//定义接

public interface IModel {
    void geturl(String url);

}


继承接口

public class WLmodel implements IModel{
    private  OnFinish onFinish ;

    public interface  OnFinish{
        void OnFinishListener(List<Bean.DataBean> data);
    }

    public void setOnFinish(OnFinish onFinish) {
        this.onFinish = onFinish;
    }

    @Override
    public void geturl(String url) {
	OkHttpClient mClient = new OkHttpClient.Builder()
        .addInterceptor(new LoggingInterceptor())//应用拦截器
        //.addNetworkInterceptor(new LoggingInterceptor())//网络拦截器
        .build();
		Retrofit retrofit = new Retrofit.Builder().
                baseUrl(url).addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
        ApiService apiService  = retrofit.create(ApiService.class);
        Observable<Bean> homes = apiService.geturl();
        homes.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Bean>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Bean bean) {
                        List<Bean.DataBean> data = bean.getData();
                        onFinish.OnFinishListener(data);
                    }
                });
    }

}


对应presenter层的东西

//Api

public class API {
    public static final String url = "http://api.expoon.com/AppNews/getNewsList/";
}

创建类
WLPresenter
public class WLPresenter implements WLmodel.OnFinish {
    private final  IView wlview;
    private final  WLmodel wLmodel;

    public WLPresenter(IView wlview) {
        this.wlview = wlview;
        this.wLmodel = new WLmodel() ;

    }

    public void getWL(String url){
        wLmodel.setOnFinish(this);
        wLmodel.geturl(url);

    }
    @Override
    public void OnFinishListener(List<Bean.DataBean> list) {
        wlview.getNews(list);
    }
}
view层
public interface IView {
    void getNews(List<Bean.DataBean> list);
}


对应的适配器

[html]  view plain  copy
  1. public class HomeAdaper extends RecyclerView.Adapter {  
  2.     Context context;  
  3.     List<News.DataBean> list;  
  4.   
  5.     public HomeAdaper(Context context, List<News.DataBean> list) {  
  6.         this.context = context;  
  7.         this.list = list;  
  8.     }  
  9.   
  10.     @Override  
  11.     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
  12.   
  13.   
  14.         MyViewHolder holder = new MyViewHolder(LayoutInflater.from(  
  15.                 context).inflate(R.layout.listview, parent,  
  16.                 false));  
  17.         return holder;  
  18.   
  19.   
  20.     }  
  21.   
  22.     @Override  
  23.     public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {  
  24.   
  25.   
  26.         MyViewHolder holder1 = (MyViewHolder) holder;  
  27.         holder1.tv.setText(list.get(position).getNews_title());  
  28.   
  29.   
  30.         holder1.draweeView1.setImageURI(list.get(position).getPic_url());  
  31.         //创建DraweeController  
  32.         DraweeController controller = Fresco.newDraweeControllerBuilder()  
  33.                 //重试之后要加载的图片URI地址  
  34.                 .setUri(list.get(position).getPic_url())  
  35.                 //设置点击重试是否开启  
  36.                 .setTapToRetryEnabled(true)  
  37.                 //动画播放  
  38.                 .setAutoPlayAnimations(true)  
  39.                 //设置旧的Controller  
  40.                 .setOldController(holder1.draweeView1.getController())  
  41.                 //构建  
  42.                 .build();  
  43.         //设置DraweeController  
  44.         holder1.draweeView1.setController(controller);  
  45.   
  46.   
  47.     }  
  48.   
  49.   
  50.     @Override  
  51.     public int getItemCount() {  
  52.         return list.size();  
  53.     }  
  54.   
  55.     class MyViewHolder extends RecyclerView.ViewHolder {  
  56.   
  57.   
  58.         SimpleDraweeView draweeView1;  
  59.         TextView tv;  
  60.   
  61.         public MyViewHolder(View view) {  
  62.             super(view);  
  63.             tv = (TextView) view.findViewById(R.id.tv);  
  64.             draweeView1 = (SimpleDraweeView) view.findViewById(R.id.img);  
  65.   
  66.         }  
  67.   
  68.   
  69.     }  
  70. }  


7. 所谓的mvp,即是(model-处理业务逻辑(主要是数据读写,或者与后台通信(其实也是读写数据)),view-处理ui控件,presenter-主导器,操作model和view)

8. 源码地址

http://download.csdn.net/detail/knxw0001/7983807


对应的主页面解析数据和接口回调

public class MainActivity extends AppCompatActivity implements IView{

    private ListView lv;
    private WLPresenter wlPresenter ;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        lv = (ListView) findViewById(R.id.lv);
        wlPresenter = new WLPresenter(this) ;
        wlPresenter.getWL(API.url);
    }

    @Override
    public void getNews(List<Bean.DataBean> list) {
        MyAdapter ma = new MyAdapter(this ,list) ;
        lv.setAdapter(ma);
    }
}
 


//下面就是相关的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.bwie.mvpwangluo.MainActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

</LinearLayout>

对应的listview布局解析的文字和图片 对用的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>



相关权限 重点 name 应用 Myapp
[html]  view plain  copy
  1. <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
  2.     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
  3.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  4.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
  5.     <application  
  6.         android:name=".Myapp"  


相关依赖

[html]  view plain  copy
  1. compile 'com.android.support:appcompat-v7:26.0.0-alpha1'  
  2. testCompile 'junit:junit:4.12'  
  3. compile 'com.squareup.retrofit2:retrofit:2.0.1'  
  4. compile 'com.squareup.retrofit2:converter-gson:2.0.1'  
  5. compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'  
  6. compile 'io.reactivex:rxandroid:1.1.0'  
  7. compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'  
  8. compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'  
  9. compile 'com.google.code.gson:gson:2.8.2'  
  10.   
  11. compile 'com.android.support:recyclerview-v7:24.0.0'  
  12.   
  13. //静态图片  
  14. compile 'com.facebook.fresco:fresco:0.12.0'  
  15. // 支持 GIF 动图,需要添加  
  16. compile 'com.facebook.fresco:animated-gif:0.12.0'  
  17. compile 'com.android.support:design:23.4.0'  

猜你喜欢

转载自blog.csdn.net/taa1007/article/details/78451737