Repository: AxeChen/retrofit2_rxjava2 Branch: master Commit: 084d55fe454f Files: 97 Total size: 268.0 KB Directory structure: gitextract_qjzdkktq/ ├── .gitignore ├── .idea/ │ ├── gradle.xml │ ├── misc.xml │ ├── modules.xml │ ├── runConfigurations.xml │ └── vcs.xml ├── README.md ├── app/ │ ├── .gitignore │ ├── .idea/ │ │ ├── .name │ │ ├── gradle.xml │ │ ├── libraries/ │ │ │ ├── android_arch_core_common_1_0_0_jar.xml │ │ │ ├── android_arch_lifecycle_common_1_0_0_jar.xml │ │ │ ├── android_arch_lifecycle_runtime_1_0_0.xml │ │ │ ├── com_android_support_animated_vector_drawable_26_1_0.xml │ │ │ ├── com_android_support_appcompat_v7_26_1_0.xml │ │ │ ├── com_android_support_constraint_constraint_layout_1_0_2.xml │ │ │ ├── com_android_support_constraint_constraint_layout_solver_1_0_2_jar.xml │ │ │ ├── com_android_support_support_annotations_26_1_0_jar.xml │ │ │ ├── com_android_support_support_compat_26_1_0.xml │ │ │ ├── com_android_support_support_core_ui_26_1_0.xml │ │ │ ├── com_android_support_support_core_utils_26_1_0.xml │ │ │ ├── com_android_support_support_fragment_26_1_0.xml │ │ │ ├── com_android_support_support_media_compat_26_1_0.xml │ │ │ ├── com_android_support_support_v4_26_1_0.xml │ │ │ ├── com_android_support_support_vector_drawable_26_1_0.xml │ │ │ ├── com_android_support_test_espresso_espresso_core_3_0_1.xml │ │ │ ├── com_android_support_test_espresso_espresso_idling_resource_3_0_1.xml │ │ │ ├── com_android_support_test_rules_1_0_1.xml │ │ │ ├── com_android_support_test_runner_1_0_1.xml │ │ │ ├── com_google_code_findbugs_jsr305_2_0_1_jar.xml │ │ │ ├── com_google_code_gson_gson_2_7_jar.xml │ │ │ ├── com_squareup_javawriter_2_1_1_jar.xml │ │ │ ├── com_squareup_okhttp3_logging_interceptor_3_8_1_jar.xml │ │ │ ├── com_squareup_okhttp3_okhttp_3_8_1_jar.xml │ │ │ ├── com_squareup_okhttp3_okhttp_urlconnection_3_2_0_jar.xml │ │ │ ├── com_squareup_okio_okio_1_13_0_jar.xml │ │ │ ├── com_squareup_retrofit2_adapter_rxjava2_2_3_0_jar.xml │ │ │ ├── com_squareup_retrofit2_converter_gson_2_3_0_jar.xml │ │ │ ├── com_squareup_retrofit2_retrofit_2_3_0_jar.xml │ │ │ ├── io_reactivex_rxjava2_rxandroid_2_0_1.xml │ │ │ ├── io_reactivex_rxjava2_rxjava_2_1_0_jar.xml │ │ │ ├── javax_inject_javax_inject_1_jar.xml │ │ │ ├── junit_junit_4_12_jar.xml │ │ │ ├── net_sf_kxml_kxml2_2_3_0_jar.xml │ │ │ ├── org_hamcrest_hamcrest_core_1_3_jar.xml │ │ │ ├── org_hamcrest_hamcrest_integration_1_3_jar.xml │ │ │ ├── org_hamcrest_hamcrest_library_1_3_jar.xml │ │ │ └── org_reactivestreams_reactive_streams_1_0_0_jar.xml │ │ ├── misc.xml │ │ ├── modules.xml │ │ ├── runConfigurations.xml │ │ ├── vcs.xml │ │ └── workspace.xml │ ├── build.gradle │ ├── gradle/ │ │ └── wrapper/ │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── local.properties │ ├── proguard-rules.pro │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ └── com/ │ │ └── mg/ │ │ └── axe/ │ │ └── retrofit2_rxjava2/ │ │ └── ExampleInstrumentedTest.java │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ └── com/ │ │ │ └── mg/ │ │ │ └── axe/ │ │ │ └── retrofit2_rxjava2/ │ │ │ ├── BaseApplication.java │ │ │ ├── MainActivity.java │ │ │ ├── bean/ │ │ │ │ └── JavaBean.java │ │ │ ├── block/ │ │ │ │ ├── Contract.java │ │ │ │ ├── Model.java │ │ │ │ ├── Presenter.java │ │ │ │ └── ViewActivity.java │ │ │ └── network/ │ │ │ ├── Exception/ │ │ │ │ ├── ApiException.java │ │ │ │ └── CustomException.java │ │ │ ├── NetWorkManager.java │ │ │ ├── converter/ │ │ │ │ ├── GsonConverterFactory.java │ │ │ │ ├── GsonRequestBodyConverter.java │ │ │ │ └── GsonResponseBodyConverter.java │ │ │ ├── request/ │ │ │ │ └── Request.java │ │ │ ├── response/ │ │ │ │ ├── Response.java │ │ │ │ └── ResponseTransformer.java │ │ │ └── schedulers/ │ │ │ ├── BaseSchedulerProvider.java │ │ │ └── SchedulerProvider.java │ │ └── res/ │ │ ├── drawable/ │ │ │ └── ic_launcher_background.xml │ │ ├── drawable-v24/ │ │ │ └── ic_launcher_foreground.xml │ │ ├── layout/ │ │ │ ├── activity_layout.xml │ │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ └── values/ │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test/ │ └── java/ │ └── com/ │ └── mg/ │ └── axe/ │ └── retrofit2_rxjava2/ │ └── ExampleUnitTest.java ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ *.iml .gradle /local.properties /.idea/workspace.xml /.idea/libraries .DS_Store /build /captures .externalNativeBuild ================================================ FILE: .idea/gradle.xml ================================================ ================================================ FILE: .idea/misc.xml ================================================ ================================================ FILE: .idea/modules.xml ================================================ ================================================ FILE: .idea/runConfigurations.xml ================================================ ================================================ FILE: .idea/vcs.xml ================================================ ================================================ FILE: README.md ================================================ # retrofit2_rxjava2 retrofit2+rxjava2封装的网络请求框架 ================================================ FILE: app/.gitignore ================================================ /build ================================================ FILE: app/.idea/.name ================================================ retrofit2_rxjava2 ================================================ FILE: app/.idea/gradle.xml ================================================ ================================================ FILE: app/.idea/libraries/android_arch_core_common_1_0_0_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/android_arch_lifecycle_common_1_0_0_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/android_arch_lifecycle_runtime_1_0_0.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_animated_vector_drawable_26_1_0.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_appcompat_v7_26_1_0.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_constraint_constraint_layout_1_0_2.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_constraint_constraint_layout_solver_1_0_2_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_support_annotations_26_1_0_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_support_compat_26_1_0.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_support_core_ui_26_1_0.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_support_core_utils_26_1_0.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_support_fragment_26_1_0.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_support_media_compat_26_1_0.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_support_v4_26_1_0.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_support_vector_drawable_26_1_0.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_test_espresso_espresso_core_3_0_1.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_test_espresso_espresso_idling_resource_3_0_1.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_test_rules_1_0_1.xml ================================================ ================================================ FILE: app/.idea/libraries/com_android_support_test_runner_1_0_1.xml ================================================ ================================================ FILE: app/.idea/libraries/com_google_code_findbugs_jsr305_2_0_1_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_google_code_gson_gson_2_7_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_squareup_javawriter_2_1_1_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_squareup_okhttp3_logging_interceptor_3_8_1_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_squareup_okhttp3_okhttp_3_8_1_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_squareup_okhttp3_okhttp_urlconnection_3_2_0_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_squareup_okio_okio_1_13_0_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_squareup_retrofit2_adapter_rxjava2_2_3_0_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_squareup_retrofit2_converter_gson_2_3_0_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/com_squareup_retrofit2_retrofit_2_3_0_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/io_reactivex_rxjava2_rxandroid_2_0_1.xml ================================================ ================================================ FILE: app/.idea/libraries/io_reactivex_rxjava2_rxjava_2_1_0_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/javax_inject_javax_inject_1_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/junit_junit_4_12_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/net_sf_kxml_kxml2_2_3_0_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/org_hamcrest_hamcrest_core_1_3_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/org_hamcrest_hamcrest_integration_1_3_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/org_hamcrest_hamcrest_library_1_3_jar.xml ================================================ ================================================ FILE: app/.idea/libraries/org_reactivestreams_reactive_streams_1_0_0_jar.xml ================================================ ================================================ FILE: app/.idea/misc.xml ================================================ ================================================ FILE: app/.idea/modules.xml ================================================ ================================================ FILE: app/.idea/runConfigurations.xml ================================================ ================================================ FILE: app/.idea/vcs.xml ================================================ ================================================ FILE: app/.idea/workspace.xml ================================================ 1519866556677 file://$PROJECT_DIR$/src/main/java/com/mg/axe/retrofit2_rxjava2/block/MyCarPresenter.java 45 file://$PROJECT_DIR$/src/main/java/com/mg/axe/retrofit2_rxjava2/block/MyCarPresenter.java 41 file://$PROJECT_DIR$/src/main/java/com/mg/axe/retrofit2_rxjava2/network/ResponseTransformer.java 23 ================================================ FILE: app/build.gradle ================================================ apply plugin: 'com.android.application' android { compileSdkVersion 26 defaultConfig { applicationId "com.mg.axe.retrofit2_rxjava2" minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' // 网络请求依赖 compile "io.reactivex.rxjava2:rxjava:2.1.0" compile "io.reactivex.rxjava2:rxandroid:2.0.1" compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.okhttp3:logging-interceptor:3.8.1' } ================================================ FILE: app/gradle/wrapper/gradle-wrapper.properties ================================================ #Thu Mar 01 09:09:18 CST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip ================================================ FILE: app/gradlew ================================================ #!/usr/bin/env bash ############################################################################## ## ## Gradle start up script for UN*X ## ############################################################################## # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS="" APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" warn ( ) { echo "$*" } die ( ) { echo echo "$*" echo exit 1 } # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false case "`uname`" in CYGWIN* ) cygwin=true ;; Darwin* ) darwin=true ;; MINGW* ) msys=true ;; esac # Attempt to set APP_HOME # Resolve links: $0 may be a link PRG="$0" # Need this for relative symlinks. while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`"/$link" fi done SAVED="`pwd`" cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" cd "$SAVED" >/dev/null CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD="$MAX_FD_LIMIT" fi ulimit -n $MAX_FD if [ $? -ne 0 ] ; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi else warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" fi fi # For Darwin, add options to specify how the application appears in the dock if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin, switch paths to Windows format before running java if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` SEP="" for dir in $ROOTDIRSRAW ; do ROOTDIRS="$ROOTDIRS$SEP$dir" SEP="|" done OURCYGPATTERN="(^($ROOTDIRS))" # Add a user-defined pattern to the cygpath arguments if [ "$GRADLE_CYGPATTERN" != "" ] ; then OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" fi # Now convert the arguments - kludge to limit ourselves to /bin/sh i=0 for arg in "$@" ; do CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` else eval `echo args$i`="\"$arg\"" fi i=$((i+1)) done case $i in (0) set -- ;; (1) set -- "$args0" ;; (2) set -- "$args0" "$args1" ;; (3) set -- "$args0" "$args1" "$args2" ;; (4) set -- "$args0" "$args1" "$args2" "$args3" ;; (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules function splitJvmOpts() { JVM_OPTS=("$@") } eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" ================================================ FILE: app/gradlew.bat ================================================ @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS= set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto init echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto init echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :init @rem Get command-line arguments, handling Windowz variants if not "%OS%" == "Windows_NT" goto win9xME_args if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. set CMD_LINE_ARGS= set _SKIP=2 :win9xME_args_slurp if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* goto execute :4NT_args @rem Get arguments from the 4NT Shell from JP Software set CMD_LINE_ARGS=%$ :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omega ================================================ FILE: app/local.properties ================================================ ## This file is automatically generated by Android Studio. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must *NOT* be checked into Version Control Systems, # as it contains information specific to your local configuration. # # Location of the SDK. This is only used by Gradle. # For customization when using a Version Control System, please read the # header note. #Thu Mar 01 09:09:16 CST 2018 ndk.dir=C\:\\Users\\Zaifeng\\AppData\\Local\\Android\\Sdk\\ndk-bundle sdk.dir=C\:\\Users\\Zaifeng\\AppData\\Local\\Android\\Sdk ================================================ FILE: app/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile ================================================ FILE: app/src/androidTest/java/com/mg/axe/retrofit2_rxjava2/ExampleInstrumentedTest.java ================================================ package com.mg.axe.retrofit2_rxjava2; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; /** * Instrumented test, which will execute on an Android device. * * @see Testing documentation */ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { @Test public void useAppContext() throws Exception { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); assertEquals("com.mg.axe.retrofit2_rxjava2", appContext.getPackageName()); } } ================================================ FILE: app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/BaseApplication.java ================================================ package com.mg.axe.retrofit2_rxjava2; import android.app.Application; import com.mg.axe.retrofit2_rxjava2.network.NetWorkManager; /** * Created by Zaifeng on 2018/3/1. */ public class BaseApplication extends Application { @Override public void onCreate() { super.onCreate(); NetWorkManager.getInstance().init(); } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/MainActivity.java ================================================ package com.mg.axe.retrofit2_rxjava2; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/bean/JavaBean.java ================================================ package com.mg.axe.retrofit2_rxjava2.bean; import android.os.Parcel; import android.os.Parcelable; public class JavaBean implements Parcelable { private int carId; private int pNumber; private String autoPay; public int getCarId() { return carId; } public void setCarId(int carId) { this.carId = carId; } public int getPnumber() { return pNumber; } public void setPnumber(int pnumber) { this.pNumber = pnumber; } public String getAutoPay() { return autoPay; } public void setAutoPay(String autoPay) { this.autoPay = autoPay; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.carId); dest.writeInt(this.pNumber); dest.writeString(this.autoPay); } public JavaBean() { } protected JavaBean(Parcel in) { this.carId = in.readInt(); this.pNumber = in.readInt(); this.autoPay = in.readString(); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public JavaBean createFromParcel(Parcel source) { return new JavaBean(source); } @Override public JavaBean[] newArray(int size) { return new JavaBean[size]; } }; } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/block/Contract.java ================================================ package com.mg.axe.retrofit2_rxjava2.block; import com.mg.axe.retrofit2_rxjava2.bean.JavaBean; import com.mg.axe.retrofit2_rxjava2.network.response.Response; import java.util.List; import io.reactivex.Observable; /** * Created by Zaifeng on 2018/3/1. */ public class Contract { public interface Persenter { public void getCarList(String userId); } public interface View { void getDataSuccess(); void getDataFail(); } public interface Model { public Observable>> getCarList(String userId); } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/block/Model.java ================================================ package com.mg.axe.retrofit2_rxjava2.block; import com.mg.axe.retrofit2_rxjava2.bean.JavaBean; import com.mg.axe.retrofit2_rxjava2.network.NetWorkManager; import com.mg.axe.retrofit2_rxjava2.network.response.Response; import java.util.List; import io.reactivex.Observable; /** * Created by Zaifeng on 2018/3/1. */ public class Model implements Contract.Model { @Override public Observable>> getCarList(String userId) { return NetWorkManager.getRequest().getList(userId); } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/block/Presenter.java ================================================ package com.mg.axe.retrofit2_rxjava2.block; import com.mg.axe.retrofit2_rxjava2.network.response.ResponseTransformer; import com.mg.axe.retrofit2_rxjava2.network.schedulers.BaseSchedulerProvider; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; /** * Created by Zaifeng on 2018/3/1. */ public class Presenter { private Model model; private Contract.View view; private BaseSchedulerProvider schedulerProvider; private CompositeDisposable mDisposable; public Presenter(Model model, Contract.View view, BaseSchedulerProvider schedulerProvider) { this.model = model; this.view = view; this.schedulerProvider = schedulerProvider; mDisposable = new CompositeDisposable(); } public void despose(){ mDisposable.dispose(); } public void getList() { Disposable disposable = model.getCarList("xxxxxx") .compose(ResponseTransformer.handleResult()) .compose(schedulerProvider.applySchedulers()) .subscribe(carBeans -> { // 处理数据 直接获取到List carBeans view.getDataSuccess(); }, throwable -> { // 处理异常 view.getDataFail(); }); mDisposable.add(disposable); } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/block/ViewActivity.java ================================================ package com.mg.axe.retrofit2_rxjava2.block; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import com.mg.axe.retrofit2_rxjava2.R; import com.mg.axe.retrofit2_rxjava2.network.schedulers.SchedulerProvider; /** * Created by Zaifeng on 2018/3/1. */ public class ViewActivity extends AppCompatActivity implements Contract.View { private Presenter presenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout); presenter = new Presenter(new Model(), this, SchedulerProvider.getInstance()); } public void btnRequest(View view) { presenter.getList(); } @Override public void getDataSuccess() { } @Override public void getDataFail() { } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/Exception/ApiException.java ================================================ package com.mg.axe.retrofit2_rxjava2.network.Exception; /** * Created by Zaifeng on 2018/2/28. * 异常处理 */ public class ApiException extends Exception { private int code; private String displayMessage; public ApiException(int code, String displayMessage) { this.code = code; this.displayMessage = displayMessage; } public ApiException(int code, String message, String displayMessage) { super(message); this.code = code; this.displayMessage = displayMessage; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getDisplayMessage() { return displayMessage; } public void setDisplayMessage(String displayMessage) { this.displayMessage = displayMessage; } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/Exception/CustomException.java ================================================ package com.mg.axe.retrofit2_rxjava2.network.Exception; import android.net.ParseException; import com.google.gson.JsonParseException; import org.json.JSONException; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; /** * Created by Zaifeng on 2018/2/28. * 本地异常处理。包括解析异常等其他异常 */ public class CustomException { /** * 未知错误 */ public static final int UNKNOWN = 1000; /** * 解析错误 */ public static final int PARSE_ERROR = 1001; /** * 网络错误 */ public static final int NETWORK_ERROR = 1002; /** * 协议错误 */ public static final int HTTP_ERROR = 1003; public static ApiException handleException(Throwable e) { ApiException ex; if (e instanceof JsonParseException || e instanceof JSONException || e instanceof ParseException) { //解析错误 ex = new ApiException(PARSE_ERROR, e.getMessage()); return ex; } else if (e instanceof ConnectException) { //网络错误 ex = new ApiException(NETWORK_ERROR, e.getMessage()); return ex; } else if (e instanceof UnknownHostException || e instanceof SocketTimeoutException) { //连接错误 ex = new ApiException(NETWORK_ERROR, e.getMessage()); return ex; } else { //未知错误 ex = new ApiException(UNKNOWN, e.getMessage()); return ex; } } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/NetWorkManager.java ================================================ package com.mg.axe.retrofit2_rxjava2.network; import com.mg.axe.retrofit2_rxjava2.network.request.Request; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by Zaifeng on 2018/2/28. * API初始化类 */ public class NetWorkManager { private static NetWorkManager mInstance; private static Retrofit retrofit; private static volatile Request request = null; public static NetWorkManager getInstance() { if (mInstance == null) { synchronized (NetWorkManager.class) { if (mInstance == null) { mInstance = new NetWorkManager(); } } } return mInstance; } /** * 初始化必要对象和参数 */ public void init() { // 初始化okhttp OkHttpClient client = new OkHttpClient.Builder() .build(); // 初始化Retrofit retrofit = new Retrofit.Builder() .client(client) .baseUrl(Request.HOST) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); } public static Request getRequest() { if (request == null) { synchronized (Request.class) { request = retrofit.create(Request.class); } } return request; } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/converter/GsonConverterFactory.java ================================================ package com.mg.axe.retrofit2_rxjava2.network.converter; import com.google.gson.Gson; import com.google.gson.TypeAdapter; import com.google.gson.reflect.TypeToken; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import okhttp3.RequestBody; import okhttp3.ResponseBody; import retrofit2.Converter; import retrofit2.Retrofit; /** * Created by Zaifeng on 2018/3/1. * 提供ResponseBody的转换和RequestBody的转换 */ public final class GsonConverterFactory extends Converter.Factory { public static GsonConverterFactory create(Gson gson) { if (gson == null) throw new NullPointerException("gson == null"); return new GsonConverterFactory(gson); } private final Gson gson; private GsonConverterFactory(Gson gson) { this.gson = gson; } @Override public Converter responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { TypeAdapter adapter = gson.getAdapter(TypeToken.get(type)); return new GsonResponseBodyConverter<>(gson, adapter); } @Override public Converter requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { TypeAdapter adapter = gson.getAdapter(TypeToken.get(type)); return new GsonRequestBodyConverter<>(gson, adapter); } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/converter/GsonRequestBodyConverter.java ================================================ package com.mg.axe.retrofit2_rxjava2.network.converter; import com.google.gson.Gson; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.Charset; import okhttp3.MediaType; import okhttp3.RequestBody; import okio.Buffer; import retrofit2.Converter; final class GsonRequestBodyConverter implements Converter { private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8"); private static final Charset UTF_8 = Charset.forName("UTF-8"); private final Gson gson; private final TypeAdapter adapter; GsonRequestBodyConverter(Gson gson, TypeAdapter adapter) { this.gson = gson; this.adapter = adapter; } @Override public RequestBody convert(T value) throws IOException { Buffer buffer = new Buffer(); Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8); JsonWriter jsonWriter = gson.newJsonWriter(writer); adapter.write(jsonWriter, value); jsonWriter.close(); return RequestBody.create(MEDIA_TYPE, buffer.readByteString()); } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/converter/GsonResponseBodyConverter.java ================================================ package com.mg.axe.retrofit2_rxjava2.network.converter; import com.google.gson.Gson; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import java.io.IOException; import okhttp3.ResponseBody; import retrofit2.Converter; final class GsonResponseBodyConverter implements Converter { private final Gson gson; private final TypeAdapter adapter; GsonResponseBodyConverter(Gson gson, TypeAdapter adapter) { this.gson = gson; this.adapter = adapter; } @Override public T convert(ResponseBody value) throws IOException { JsonReader jsonReader = gson.newJsonReader(value.charStream()); try { return adapter.read(jsonReader); } finally { value.close(); } } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/request/Request.java ================================================ package com.mg.axe.retrofit2_rxjava2.network.request; import com.mg.axe.retrofit2_rxjava2.bean.JavaBean; import com.mg.axe.retrofit2_rxjava2.network.response.Response; import java.util.List; import io.reactivex.Observable; import retrofit2.http.POST; import retrofit2.http.Query; /** * Created by Zaifeng on 2018/2/28. * 封装请求的接口 */ public interface Request { public static String HOST = "https://xxxx.api.xxx.com/xxxx/"; @POST("?service=User.getList") Observable>> getList(@Query("userId") String userId); } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/response/Response.java ================================================ package com.mg.axe.retrofit2_rxjava2.network.response; /** * Created by Zaifeng on 2018/2/28. * 返回结果封装 */ public class Response { private int ret; // 返回的code private T data; // 具体的数据结果 private String msg; // message 可用来返回接口的说明 public int getCode() { return ret; } public void setCode(int code) { this.ret = code; } public T getData() { return data; } public void setData(T data) { this.data = data; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/response/ResponseTransformer.java ================================================ package com.mg.axe.retrofit2_rxjava2.network.response; import com.mg.axe.retrofit2_rxjava2.network.Exception.ApiException; import com.mg.axe.retrofit2_rxjava2.network.Exception.CustomException; import com.mg.axe.retrofit2_rxjava2.network.response.Response; import io.reactivex.Observable; import io.reactivex.ObservableSource; import io.reactivex.ObservableTransformer; import io.reactivex.functions.Function; /** * Created by Zaifeng on 2018/2/28. * 对返回的数据进行处理,区分异常的情况。 */ public class ResponseTransformer { public static ObservableTransformer, T> handleResult() { return upstream -> upstream .onErrorResumeNext(new ErrorResumeFunction<>()) .flatMap(new ResponseFunction<>()); } /** * 非服务器产生的异常,比如本地无无网络请求,Json数据解析错误等等。 * * @param */ private static class ErrorResumeFunction implements Function>> { @Override public ObservableSource> apply(Throwable throwable) throws Exception { return Observable.error(CustomException.handleException(throwable)); } } /** * 服务其返回的数据解析 * 正常服务器返回数据和服务器可能返回的exception * * @param */ private static class ResponseFunction implements Function, ObservableSource> { @Override public ObservableSource apply(Response tResponse) throws Exception { int code = tResponse.getCode(); String message = tResponse.getMsg(); if (code == 200) { return Observable.just(tResponse.getData()); } else { return Observable.error(new ApiException(code, message)); } } } } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/schedulers/BaseSchedulerProvider.java ================================================ package com.mg.axe.retrofit2_rxjava2.network.schedulers; import android.support.annotation.NonNull; import io.reactivex.ObservableTransformer; import io.reactivex.Scheduler; public interface BaseSchedulerProvider { @NonNull Scheduler computation(); @NonNull Scheduler io(); @NonNull Scheduler ui(); @NonNull ObservableTransformer applySchedulers(); } ================================================ FILE: app/src/main/java/com/mg/axe/retrofit2_rxjava2/network/schedulers/SchedulerProvider.java ================================================ package com.mg.axe.retrofit2_rxjava2.network.schedulers; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import io.reactivex.ObservableTransformer; import io.reactivex.Scheduler; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; /** * Created by Zaifeng on 2018/2/28. * 线程切换 */ public class SchedulerProvider implements BaseSchedulerProvider { @Nullable private static SchedulerProvider INSTANCE; // Prevent direct instantiation. private SchedulerProvider() { } public static synchronized SchedulerProvider getInstance() { if (INSTANCE == null) { INSTANCE = new SchedulerProvider(); } return INSTANCE; } @Override @NonNull public Scheduler computation() { return Schedulers.computation(); } @Override @NonNull public Scheduler io() { return Schedulers.io(); } @Override @NonNull public Scheduler ui() { return AndroidSchedulers.mainThread(); } @NonNull @Override public ObservableTransformer applySchedulers() { return observable -> observable.subscribeOn(io()) .observeOn(ui()); } } ================================================ FILE: app/src/main/res/drawable/ic_launcher_background.xml ================================================ ================================================ FILE: app/src/main/res/drawable-v24/ic_launcher_foreground.xml ================================================ ================================================ FILE: app/src/main/res/layout/activity_layout.xml ================================================