本文共 6586 字,大约阅读时间需要 21 分钟。
MVP是一种架构,是区别于MVC的,可以有更好的去耦合性,最终的目的都是方便于我们的开发维护工作。有兴趣的可以google了解详情,也可以通过我这个简单的demo有个初步的一些体验与了解
下面讲述一下具体该怎么在代码里面用。
第一:新增一个Project,使用RxAndroid之前的一些工具包的准备(在Module:app里面的build.gradle的dependencies里面添加 ),下面是我的build.gradle的代码
apply plugin: 'com.android.application'android { compileSdkVersion 23 buildToolsVersion "24.0.0" defaultConfig { applicationId "oysd.com.rxandroid_mvp_demo" minSdkVersion 17 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:cardview-v7:23.4.0' compile 'com.android.support:recyclerview-v7:23.4.0' compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.google.code.gson:gson:2.4' compile 'com.jakewharton:butterknife:7.0.1' compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.squareup.okhttp3:okhttp:3.+'}
第二:把框架搭起来,新增四个package(bean,model,presenter,view),bean包主要是装一些java的基类,这里可用也可以不用,model包里面装一些与数据打交道的类,presenter包里面装一些model包里面的数据需要在view包里面呈现的类,view包里面就是界面更新的接口类
第三:给出指定的工作流程,使用此框架实现它,我这个代码里面的工作流程:点击界面的按钮,从网上获取图片,然后显示在界面上。
第四:根据给出的工作流,一步步代码实现
①界面的实现(一个Button,一个ImageView),以下是布局代码
②根据工作流程,界面处理的接口定义
package oysd.com.rxandroid_mvp_demo.view;/** * Created by ouyangshengduo on 2016/9/12. */public interface UserView { void showPic(byte[] data); void showProgressDialog(); void hideProgressDialog(); void showError(String msg);}
③数据处理的逻辑实现,定义被观察者,在这里实现下载图片的异步操作(代表着简单的耗时操作)
package oysd.com.rxandroid_mvp_demo.model;import java.io.IOException;import okhttp3.Call;import okhttp3.Callback;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;import rx.Observable;import rx.Subscriber;/** * Created by ouyangshengduo on 2016/9/12. */public class UserModel { private OkHttpClient client; public UserModel(){ client = new OkHttpClient(); } public ObservablegetUserImage(final String path){ return Observable.create(new Observable.OnSubscribe () { @Override public void call(final Subscriber subscriber) { Request request = new Request.Builder().url(path).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { subscriber.onError(e); } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){ byte [] data = response.body().bytes(); if(data != null){ subscriber.onNext(data); } } subscriber.onCompleted(); } }); } }); }}
④通过数据处理层(model)以及界面接口层(view),完成这两者的联系,实现这个A数据处理应该分发给B界面去显示
package oysd.com.rxandroid_mvp_demo.presenter;import oysd.com.rxandroid_mvp_demo.view.UserView;import oysd.com.rxandroid_mvp_demo.model.UserModel;import rx.Subscriber;import rx.android.schedulers.AndroidSchedulers;import rx.schedulers.Schedulers;/** * Created by ouyangshengduo on 2016/9/12. */public class UserPresenter { private UserView userView; private UserModel userModel; public UserPresenter(UserView userView){ this.userView = userView; userModel = new UserModel(); } public void getUserImage(final String path){ userView.showProgressDialog(); userModel.getUserImage(path).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber() { @Override public void onCompleted() { userView.hideProgressDialog(); } @Override public void onError(Throwable e) { userView.showError(e.getMessage()); userView.hideProgressDialog(); } @Override public void onNext(byte[] bytes) { userView.showPic(bytes); } }); }}
⑤完成Activity的工作流程
package oysd.com.rxandroid_mvp_demo;import android.app.ProgressDialog;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import oysd.com.rxandroid_mvp_demo.presenter.UserPresenter;import oysd.com.rxandroid_mvp_demo.view.UserView;public class MainActivity extends AppCompatActivity implements UserView{ private Button button; private ImageView imageView; private ProgressDialog mProgressDialog; private UserPresenter userPresenter; private String PATH = "http://a.hiphotos.baidu.com/zhidao/pic/item/a50f4bfbfbedab640bc293fbf636afc379311e5c.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); imageView = (ImageView) findViewById(R.id.imageView); userPresenter = new UserPresenter(this); mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("正在加载,请稍后.."); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v){ userPresenter.getUserImage(PATH); } }); } @Override public void showPic(byte[] data) { if(data != null){ Bitmap bitmap = BitmapFactory.decodeByteArray(data,0,data.length); imageView.setImageBitmap(bitmap); } } @Override public void showProgressDialog() { mProgressDialog.show(); } @Override public void hideProgressDialog() { mProgressDialog.hide(); } @Override public void showError(String msg) { Toast.makeText(this,msg,Toast.LENGTH_SHORT).show(); }}
第五:运行此程序,体验一下这个简单demo吧
如有兴趣,可以直接去Github去下载项目源码:
转载地址:http://mgxji.baihongyu.com/