zoukankan      html  css  js  c++  java
  • 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.+'
    
    }
    View Code

      第二:把框架搭起来,新增四个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>
    View Code

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

    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);
    
    }
    View Code

      ③数据处理的逻辑实现,定义被观察者,在这里实现下载图片的异步操作(代表着简单的耗时操作)

    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();
                        }
                    });
                }
            });
        }
    }
    View Code

      ④通过数据处理层(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);
                }
            });
        }
    }
    View Code

      ⑤完成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();
        }
    }
    View Code

      第五:运行此程序,体验一下这个简单demo吧

      如有兴趣,可以直接去Github去下载项目源码:https://github.com/ouyangshengduo/RxAndroid_MVP_Demo.git

  • 相关阅读:
    查看mysql版本的四种方法及常用命令
    newInstance和new的区别(good)
    Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 前缀表达式
    Java实现 蓝桥杯 算法训练 前缀表达式
  • 原文地址:https://www.cnblogs.com/ouyangduoduo/p/5899539.html
Copyright © 2011-2022 走看看