Проверьте сетевое соединение в Observable перед выполнением вызовов API

Я пытаюсь использовать следующую функцию для проверки сетевого подключения

 private boolean isThereInternetConnection() {
        boolean isConnected;
        ConnectivityManager connectivityManager =
                (ConnectivityManager) this.context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        isConnected = (networkInfo != null && networkInfo.isConnectedOrConnecting());

        return isConnected;
    } 

Затем вызовите его, прежде чем я сделаю вызовы API, такие как:

public Observable<UserEntity> userEntity(int page) {                                        return Observable.create(new Observable.OnSubscribe<UserEntity>() {
            @Override
            public void call(Subscriber<? super UserEntity> subscriber) {
                if (isThereInternetConnection()) {
                  // I want to return:
                return mUserApi.UserEntity(items,page);
                // in:
                  subscriber.onNext()
                } // otherwise return no internet connection message
            }
        });

Имейте в виду, что mUserApi.UserEntity(items,page);вызов интерфейса возвращает наблюдаемый объект, такой как:

@GET("/user")
    Observable <UserEntity> UserEntity(@Query("user_ids") String user_id, @Query("page") int  page);

1 ответ

Решение

РЕДАКТИРОВАТЬ:

Есть ваш звонок на отдых:

@GET("/user")
Observable <UserEntity> UserEntity(@Query("user_ids") String user_id, @Query("page") int  page);

В вашем классе, где вы инициализируете restAdapter, реализуйте UserEntity:

public Observable<UserEntity> getUserEntity(String userId, int page){
    return myRestAdapterInterface.UserEntity(userId, page);
}

Сделайте вашу наблюдаемую, которая будет излучать данные:

public Observable<UserEntity> userEntity(String userId, int page) {
    return getUserEntity(userId, page).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
//you can map, filter or do anything here   
}

Тогда подпишитесь на данные:

userEntity("id",5).subscribe(new Observer<UserEntity>() {
        @Override
        public void onCompleted() {
            //doSomething if u want
        }

        @Override
        public void onError(Throwable e) {
            //handle error
        }

        @Override
        public void onNext(List<UserEntity> userEntity) {
            //do something with the data
        }
    });

А для проверки соединения создайте свой собственный клиент для модернизации:

public class ConnectivityAwareUrlClient implements Client {

private Context context;
private Client wrappedClient;

public ConnectivityAwareUrlClient(Context context, Client client) {
    this.context = context;
    this.wrappedClient = client;

}

@Override
public Response execute(Request request) throws IOException {
    if (!ConnectivityUtil.isConnected(context)) {
        throw RetrofitError.unexpectedError("No internet", new NoConnectivityException("No Internet"));
    } else {
        Response response = wrappedClient.execute(request);

        return response;
    }
}

}

И при настройке RestAdapter используйте его:

RestAdapter.Builder().setEndpoint(serverHost)
                 .setClient(new ConnectivityAwareUrlClient(new OkHttpClient(), ...))
Другие вопросы по тегам