博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RxAndroid + OkHttp + MVP(Android Studio)
阅读量:4068 次
发布时间:2019-05-25

本文共 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 Observable
getUserImage(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/

你可能感兴趣的文章
分布式缓存负载均衡负载均衡的缓存处理:虚拟节点对一致性hash的改进
查看>>
分布式存储系统设计(1)—— 系统架构
查看>>
MySQL数据库的高可用方案总结
查看>>
常用排序算法总结(一) 比较算法总结
查看>>
SSH原理与运用
查看>>
SIGN UP BEC2
查看>>
S3C2440中对LED驱动电路的理解
查看>>
《天亮了》韩红
查看>>
Windows CE下USB摄像头驱动开发(以OV511为例,附带全部源代码以及讲解) [转]
查看>>
出现( linker command failed with exit code 1)错误总结
查看>>
iOS开发中一些常见的并行处理
查看>>
iOS获取手机的Mac地址
查看>>
ios7.1发布企业证书测试包的问题
查看>>
如何自定义iOS中的控件
查看>>
iOS 开发百问
查看>>
Mac环境下svn的使用
查看>>
github简单使用教程
查看>>
如何高效利用GitHub
查看>>
环境分支-git版本管理
查看>>
uni-app 全局变量
查看>>