Huy Tower
Huy Tower

Reputation: 7976

Error Handle in Rxjava : ConnectException: Failed to connect

I'm working with Rxjava Error Handling,

Default RxJavaCallAdapterFactory can handle many errors,

But I still get crash for case my FCM Server is died already.

This is

/**
* Created by Administrator on 16/09/2016.
* In Dagger 2 frameworks.
* Network Module for implement Retrofit + Gson structure
*/
@Module
public class NetworkModule {

private final String baseURL;

public NetworkModule(String baseURL) {
    this.baseURL = baseURL;
}

@Singleton
@Provides
FCMApi provideFCMApi(@Named("fcm") Retrofit retrofit) {
    return retrofit.create(FCMApi.class);
}

@Singleton
@Provides
@Named("fcm")
Retrofit provideFCMRetrofit(@Named("fcm") OkHttpClient okHttpClient, Context context) {
    return new Retrofit.Builder()
            .baseUrl(context.getString(R.string.host_fcm))
            .client(okHttpClient)
            .addConverterFactory(GsonConverterFactory.create())

            // TODO CRASH IN HERE, IF ENABLE, HOW TO AVOID THIS RXJAVA ERROR HANDLING WITHOUT RUNTIME WARNING
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
}

@Singleton
@Provides
@Named("fcm")
OkHttpClient getOkHttpClientForFCM(Context context, @Named("fcm") Interceptor interceptor) {
    OkHttpClient.Builder okClientBuilder = new OkHttpClient.Builder();
    okClientBuilder.addInterceptor(interceptor);

    if (BuildConfig.DEBUG) {
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel( HttpLoggingInterceptor.Level.BASIC);

        // Can be Level.BASIC, Level.HEADERS, or Level.BODY
        // See http://square.github.io/okhttp/3.x/logging-interceptor/ to see the options.
        okClientBuilder.addInterceptor(httpLoggingInterceptor);
    }

    final File baseDir = context.getCacheDir();
    if (baseDir != null) {
        final File cacheDir = new File(baseDir, "HttpResponseCache");
        okClientBuilder.cache(new Cache(cacheDir, 50 * 1024 * 1024));
    }

    return okClientBuilder.build();
}

@Singleton @Provides @Named("fcm")
Interceptor provideInterceptorForFCM(final Context context) {
    return chain -> {
        /**
         * Add header with following attributes as agree with Web Server
         * - Token
         */
        Request original = chain.request();

        // Add header to request
        Request.Builder requestBuilder = original.newBuilder();

        requestBuilder
                .addHeader("X-Auth-Token", context.getString(R.string.x_auth_token))
                .addHeader("X-Asukabu-Client-Device-ID", getAndroidId(context));

        Request request = requestBuilder.build();
        return chain.proceed(request);
    };
}

People who know how to avoid this crash,

Or if enable, can skip Error Handling in Retrofit 2,

Please tell me,

Thank you,

p/s : I use Dagger2.

Upvotes: 1

Views: 726

Answers (1)

Alex Shutov
Alex Shutov

Reputation: 3282

There is method .onErrorReturn() in rxJava, you can return empty object instead of error

Upvotes: 2

Related Questions