提交 90de605f 编写于 作者: J jessyan

RxErrorHandler add to jcenter

上级 cfa05b6e
......@@ -92,7 +92,7 @@ dependencies {
compile rootProject.ext.dependencies["timber"]
compile rootProject.ext.dependencies["glide"]
apt rootProject.ext.dependencies["dagger2-apt-compiler"]
compile (project(':rxerrorhandler')){
compile (rootProject.ext.dependencies["rxerrorhandler"]){
exclude module: 'rxjava'
}
}
......@@ -52,6 +52,7 @@ ext {
"okhttp-urlconnection" : "com.squareup.okhttp:okhttp-urlconnection:2.0.0",
"otto" : "com.squareup:otto:1.3.8",
"paginate" : "com.github.markomilos:paginate:0.5.1",
"rxerrorhandler" : "me.jessyan:rxerrorhandler:1.0.1",
//test
"runner" : 'com.android.support.test:runner:0.5',
"espresso-core" : "com.android.support.test.espresso:espresso-core:${android["espressoSdkVersion"]}",
......
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 15
targetSdkVersion 25
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:25.1.1'
compile 'io.reactivex:rxjava:1.2.6'
}
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/jess/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# 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 *;
#}
package me.jessyan.rxerrorhandler;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
*/
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
}
\ No newline at end of file
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.jessyan.rxerrorhandler">
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
</application>
</manifest>
package me.jessyan.rxerrorhandler.core;
import android.content.Context;
import me.jessyan.rxerrorhandler.handler.ErrorHandlerFactory;
import me.jessyan.rxerrorhandler.handler.listener.ResponseErroListener;
import static me.jessyan.rxerrorhandler.utils.Preconditions.checkNotNull;
/**
* Created by jess on 9/2/16 13:27
* Contact with jess.yan.effort@gmail.com
*/
public class RxErrorHandler {
public final String TAG = this.getClass().getSimpleName();
private ErrorHandlerFactory mHandlerFactory;
private RxErrorHandler(Builder builder) {
this.mHandlerFactory = builder.errorHandlerFactory;
}
public static Builder builder() {
return new Builder();
}
public ErrorHandlerFactory getmHandlerFactory() {
return mHandlerFactory;
}
public static final class Builder {
private Context context;
private ResponseErroListener responseErroListener;
private ErrorHandlerFactory errorHandlerFactory;
private Builder() {
}
public Builder with(Context context) {
this.context = context;
return this;
}
public Builder responseErroListener(ResponseErroListener responseErroListener) {
this.responseErroListener = responseErroListener;
return this;
}
public RxErrorHandler build() {
checkNotNull(context,"context is required");
checkNotNull(responseErroListener,"responseErroListener is required");
this.errorHandlerFactory = new ErrorHandlerFactory(context, responseErroListener);
return new RxErrorHandler(this);
}
}
}
package me.jessyan.rxerrorhandler.handler;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import rx.Subscriber;
/**
* Created by jess on 9/2/16 14:41
* Contact with jess.yan.effort@gmail.com
*/
public abstract class ErrorHandleSubscriber<T> extends Subscriber<T> {
private ErrorHandlerFactory mHandlerFactory;
public ErrorHandleSubscriber(RxErrorHandler rxErrorHandler){
this.mHandlerFactory = rxErrorHandler.getmHandlerFactory();
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
mHandlerFactory.handleError(e);
}
}
package me.jessyan.rxerrorhandler.handler;
import android.content.Context;
import me.jessyan.rxerrorhandler.handler.listener.ResponseErroListener;
/**
* Created by jess on 9/2/16 13:47
* Contact with jess.yan.effort@gmail.com
*/
public class ErrorHandlerFactory {
public final String TAG = this.getClass().getSimpleName();
private Context mContext;
private ResponseErroListener mResponseErroListener;
public ErrorHandlerFactory(Context mContext, ResponseErroListener mResponseErroListener) {
this.mResponseErroListener = mResponseErroListener;
this.mContext = mContext;
}
/**
* 处理错误
* @param throwable
*/
public void handleError(Throwable throwable) {
mResponseErroListener.handleResponseError(mContext, (Exception) throwable);
}
}
package me.jessyan.rxerrorhandler.handler;
import android.util.Log;
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.functions.Func1;
/**
* Created by jess on 9/2/16 14:32
* Contact with jess.yan.effort@gmail.com
*/
public class RetryWithDelay implements
Func1<Observable<? extends Throwable>, Observable<?>> {
public final String TAG = this.getClass().getSimpleName();
private final int maxRetries;
private final int retryDelaySecond;
private int retryCount;
public RetryWithDelay(int maxRetries, int retryDelaySecond) {
this.maxRetries = maxRetries;
this.retryDelaySecond = retryDelaySecond;
}
@Override
public Observable<?> call(Observable<? extends Throwable> attempts) {
return attempts
.flatMap(new Func1<Throwable, Observable<?>>() {
@Override
public Observable<?> call(Throwable throwable) {
if (++retryCount <= maxRetries) {
// When this Observable calls onNext, the original Observable will be retried (i.e. re-subscribed).
Log.d(TAG, "get error, it will try after " + retryDelaySecond
+ " second, retry count " + retryCount);
return Observable.timer(retryDelaySecond,
TimeUnit.SECONDS);
}
// Max retries hit. Just pass the error along.
return Observable.error(throwable);
}
});
}
}
\ No newline at end of file
package me.jessyan.rxerrorhandler.handler.listener;
import android.content.Context;
/**
* Created by jess on 9/2/16 13:58
* Contact with jess.yan.effort@gmail.com
*/
public interface ResponseErroListener {
void handleResponseError(Context context,Exception e);
ResponseErroListener EMPTY = new ResponseErroListener() {
@Override
public void handleResponseError(Context context, Exception e) {
}
};
}
package me.jessyan.rxerrorhandler.utils;
import android.support.annotation.Nullable;
/**
* Created by jess on 26/09/2016 13:59
* Contact with jess.yan.effort@gmail.com
*/
public final class Preconditions {
private Preconditions() {
}
public static void checkArgument(boolean expression) {
if(!expression) {
throw new IllegalArgumentException();
}
}
public static void checkArgument(boolean expression, @Nullable Object errorMessage) {
if(!expression) {
throw new IllegalArgumentException(String.valueOf(errorMessage));
}
}
public static void checkArgument(boolean expression, @Nullable String errorMessageTemplate, @Nullable Object... errorMessageArgs) {
if(!expression) {
throw new IllegalArgumentException(format(errorMessageTemplate, errorMessageArgs));
}
}
public static void checkState(boolean expression) {
if(!expression) {
throw new IllegalStateException();
}
}
public static void checkState(boolean expression, @Nullable Object errorMessage) {
if(!expression) {
throw new IllegalStateException(String.valueOf(errorMessage));
}
}
public static void checkState(boolean expression, @Nullable String errorMessageTemplate, @Nullable Object... errorMessageArgs) {
if(!expression) {
throw new IllegalStateException(format(errorMessageTemplate, errorMessageArgs));
}
}
public static <T> T checkNotNull(T reference) {
if(reference == null) {
throw new NullPointerException();
} else {
return reference;
}
}
public static <T> T checkNotNull(T reference, @Nullable Object errorMessage) {
if(reference == null) {
throw new NullPointerException(String.valueOf(errorMessage));
} else {
return reference;
}
}
public static <T> T checkNotNull(T reference, @Nullable String errorMessageTemplate, @Nullable Object... errorMessageArgs) {
if(reference == null) {
throw new NullPointerException(format(errorMessageTemplate, errorMessageArgs));
} else {
return reference;
}
}
public static int checkElementIndex(int index, int size) {
return checkElementIndex(index, size, "index");
}
public static int checkElementIndex(int index, int size, @Nullable String desc) {
if(index >= 0 && index < size) {
return index;
} else {
throw new IndexOutOfBoundsException(badElementIndex(index, size, desc));
}
}
private static String badElementIndex(int index, int size, String desc) {
if(index < 0) {
return format("%s (%s) must not be negative", new Object[]{desc, Integer.valueOf(index)});
} else if(size < 0) {
throw new IllegalArgumentException((new StringBuilder(26)).append("negative size: ").append(size).toString());
} else {
return format("%s (%s) must be less than size (%s)", new Object[]{desc, Integer.valueOf(index), Integer.valueOf(size)});
}
}
public static int checkPositionIndex(int index, int size) {
return checkPositionIndex(index, size, "index");
}
public static int checkPositionIndex(int index, int size, @Nullable String desc) {
if(index >= 0 && index <= size) {
return index;
} else {
throw new IndexOutOfBoundsException(badPositionIndex(index, size, desc));
}
}
private static String badPositionIndex(int index, int size, String desc) {
if(index < 0) {
return format("%s (%s) must not be negative", new Object[]{desc, Integer.valueOf(index)});
} else if(size < 0) {
throw new IllegalArgumentException((new StringBuilder(26)).append("negative size: ").append(size).toString());
} else {
return format("%s (%s) must not be greater than size (%s)", new Object[]{desc, Integer.valueOf(index), Integer.valueOf(size)});
}
}
public static void checkPositionIndexes(int start, int end, int size) {
if(start < 0 || end < start || end > size) {
throw new IndexOutOfBoundsException(badPositionIndexes(start, end, size));
}
}
private static String badPositionIndexes(int start, int end, int size) {
return start >= 0 && start <= size?(end >= 0 && end <= size?format("end index (%s) must not be less than start index (%s)", new Object[]{Integer.valueOf(end), Integer.valueOf(start)}):badPositionIndex(end, size, "end index")):badPositionIndex(start, size, "start index");
}
static String format(String template, @Nullable Object... args) {
template = String.valueOf(template);
StringBuilder builder = new StringBuilder(template.length() + 16 * args.length);
int templateStart = 0;
int i;
int placeholderStart;
for(i = 0; i < args.length; templateStart = placeholderStart + 2) {
placeholderStart = template.indexOf("%s", templateStart);
if(placeholderStart == -1) {
break;
}
builder.append(template.substring(templateStart, placeholderStart));
builder.append(args[i++]);
}
builder.append(template.substring(templateStart));
if(i < args.length) {
builder.append(" [");
builder.append(args[i++]);
while(i < args.length) {
builder.append(", ");
builder.append(args[i++]);
}
builder.append(']');
}
return builder.toString();
}
}
<resources>
<string name="app_name">RxErrorHandler</string>
</resources>
package me.jessyan.rxerrorhandler;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* To work on unit tests, switch the Test Artifact in the Build Variants view.
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
include ':app', ':arms', ':rxerrorhandler'
include ':app', ':arms'
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册