RxAndroid + OkHttp + MVP(Android Studio)

  忙了有一年多了,一直没有空出时间来整理整理自己工作上遇到一些问题,但是自己内心一直惦记着这个事,因为把自己比较熟悉的知识分享出去,如果能够帮到一些人,从某种意义上来说,是非常有价值的。

  好了,不闲聊了,这次分享的是一些比较基础的,但也是应该掌握的,RxAndroid + OKHttp + MVP ,开发工具是Android Studio,主要针对的是一些新手,高手路过,勿喷。建议还在使用Eclipse的小伙伴早点转到Android Studio来,因为以前作为Eclipse的忠实粉丝的我,最终也转到了Android Studio上来了,因为趋势。

  如果有对RxAndroid还不清楚的,可以去google上搜一搜,恶补一下基础知识。我这边的理解就是一种响应式的编程,处理一些耗时的操作的一种逻辑清晰的解决方案。当处理完某个比较耗时的操作的时候能够实时获取到这么一个状态,然后再主UI线程进行实时更新的一种编程思想。

  OkHttp框架是一个用得比较广,比较频繁的一个网络请求框架,在这里就不进行过多的赘述了,因为简单的demo用到的也是比较简单的功能。

  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),以下是布局代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="oysd.com.rxandroid_mvp_demo.MainActivity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="48dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="下载图片"
        android:id="@+id/button"
        android:layout_alignParentBottom="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true" />
</RelativeLayout>

  ②根据工作流程,界面处理的接口定义

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<byte[]> getUserImage(final String path){
        return Observable.create(new Observable.OnSubscribe<byte[]>() {
            @Override
            public void call(final Subscriber<? super byte[]> 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<byte[]>() {
            @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去下载项目源码:https://github.com/ouyangshengduo/RxAndroid_MVP_Demo.git

时间: 2024-07-30 06:08:44

RxAndroid + OkHttp + MVP(Android Studio)的相关文章

Android Studio插件之MVPHelper,一键生成MVP代码

MVP盛行,听到的最多的抱怨就是咋要写这么多接口,那么本文作者提供了一个插件,自动生成这些接口的声明.感兴趣的还可以学习该插件的写法,按照自己平时的需求修改,提供开发效率. MVPHelper 一款Intellj IDEA 和Android Studio的插件,可以为MVP生成接口以及实现类,解放双手. Github 地址 : https://github.com/githubwing/MVPHelper 注意 对于MVP模式,定义一个Contract类来放置Model View Present

浅谈Android studio中OKHttp安装及简单使用

Google貌似在6.0版本里面删除了HttpClient相关API,鉴于okhttp的口碑相当好,介绍一下OKHttp的安装及使用: 一.安装 对于Android Studio的用户,在Project Structure--->Dependencies 点击"+"号选Library dependency在搜索页面分别搜okttp,okio 注:okhttp内部依赖okio,别忘了同时导入okio 二.用法 (一)Http Get  Http Post //创建okHttpCli

从编程的角度理解gradle脚本??Android Studio脚本构建和编程

本篇文章由嵌入式企鹅圈原创团队.魅族资深工程师degao撰写! 随着Android 开发环境从Eclipse转向Android Studio,我们每个人都开始或多或少要接触gradle脚本,大多数人将gradle看做构建工具,出现问题不知如何着手分析,只能寄希望百度能找到解决方案,其实大可不必. 如果我们把gradle看做编程框架,并理清gradle脚本与gradle对象的关系,通过查阅文档,不但能清晰理解gradle脚本,而且出现问题再也不用百度,通过查阅文档就能轻松解决问题. 本文就通过一个

Android Studio各种快捷功能及好用的插件

转载:http://www.jianshu.com/p/c439605a4364 概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. Postfix completion Postfix completion 是IntelliJ IDEA很早就有的功能,该功能基于已经输入的表达式和你添加的后缀来实现另一个你想要的表达式.例如在布尔表达式之后加上后缀if

Android Studio 快速开发

概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. Postfix completion 介绍 Postfix completion 是IntelliJ IDEA很早就有的功能,该功能基于已经输入的表达式和你添加的后缀来实现另一个你想要的表达式.例如在布尔表达式之后加上后缀if就是if语句 . 常用后缀介绍 下面介绍一下个人工作中觉得比较常用的几个后缀

Android Studio 3.0 新特性

Kotlin 集成 基于IDEA 2017.1 版本构建 对Android O 的支持 对Java8的支持 新的Android Gradle 插件 Google's Maven repository 新的Android分析器(New Android Profiler) APK 调试器 新的设备文件浏览器 Instant Apps support 布局编辑器改进 新的Android Tings 模板 Layout Inspector改进 APK Analyzer 改进 新的Android模拟器功能

踩坑实录 Android studio中关于 No cached version of **** available for of处理办法

当我们添加某些依赖库(Okhttp.Retrofit)时, Android studio 会报如下错误: Error:A problem occurred configuring project ':app'.> Could not resolve all dependencies for configuration ':app:_iranDebugCompile'.   > Could not resolve com.facebook.network.connectionclass:conn

如何使用Android Studio把library分享到jCenter和Maven Central

原文:How to distribute your own Android library through jCenter and Maven Central from Android Studio 如果你想在Android Studio中引入一个library到你的项目,你只需添加如下的一行代码到模块的build.gradle文件中. 1 2 3 dependencies { compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.

Android Studio 入门

本文适用于从Eclipse转AndroidStudio的开发人员 近期打算写一个系列的android0基础开发教程,估计40篇以上的文章,结合我实际工作中的经验,写一些工作中经经常使用到的技术,让刚開始学习的人能够少走弯路,这是本系列的第一篇文章,345大神写的. 原文地址 一. 下载安装 安装JDK并配置JAVA_HOME环境变量 这个就略过了,纯小白请自行百度 Android Studio安装 截止到2016年4月9日Android studio的最新稳定版本号为2.0,推荐使用该稳定版本号