java.net.UnknownHostException: Невозможно разрешить хост "": Нет адреса, связанного с именем хоста - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь сделать сообщение на сервере с объектом типа Attendance, когда я подключен к определенной сети WiFi.Метод sentAttendanceListFromCacheObservable здесь не имеет значения.Когда вызывается метод postAttendance внутри flatMap, он всегда входит в onError с сообщением

java.net.UnknownHostException: Невозможно разрешить хост "": Нет адреса, связанного с именем хоста.

вот метод postAttendance.

 public void postAttendance(String date, String checkIn, String checkOut, String breakTime, boolean finishActivity) {
    view.showProgress(view.getStringFromResId(R.string.wait));
    Attendance attendance = new Attendance();
    attendance.setDate(date);
    attendance.setCheckInTime(checkIn);
    attendance.setCheckoutTime(checkOut);
    attendance.setBreakTime(DateUtils.getNumberOfMinutesFromHourStringWithDifferentFormat(breakTime));
    //aici
    addSubscription(attendanceManager.sendAttendanceListFromCacheObservable()
            .flatMap(response -> {
                return attendanceManager.postAttendance(attendance);
            })
            .doOnNext(response -> {
                if(response != null) {
                    sessionManager.setGeofenceStatus("");
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .unsubscribeOn(Schedulers.io())
            .doAfterTerminate(() -> {
                view.hideProgress();
            })
            .subscribe(new Subscriber<Attendance>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, "", e);
                    view.handleError(e, true);
                }

                @Override
                public void onNext(Attendance response) {
                    if (finishActivity) {
                        view.finishActivity();
                    } else {
                        view.postAttendanceSuccessfully(response);
                    }
                }
            }));
}

, а вот метод, который выдает мне ошибку..flatMap (isReachable -> {} никогда не вызывается.

 public Observable<Attendance> postAttendance(Attendance attendance) {
    return Observable.fromCallable(() -> InetAddress.getByName(BuildConfig.PING_URL).isReachable(TIMEOUT))
            .flatMap(isReachable -> {
                if (isReachable) {
                    return apiService.postAttendance(sessionManager.getAccessToken(), attendance)
                            .doOnError(throwable -> FileUtils.writeFile(TAG + " " + throwable.getMessage()))
                            .doOnNext(r -> FileUtils.writeFile(TAG + " attendance successfully sent to server: date: " + attendance.getDate() + " checkin: " + attendance.getCheckInTime() + " checkout" + attendance.getCheckoutTime()))
                            .flatMap(serverAttendance -> getUserMonthlyActivity(attendance.getDate())
                                    .map(userMonthlyActivities -> serverAttendance));
                } else {
                    UserAttendanceDB userAttendanceDB = new UserAttendanceDB();
                    userAttendanceDB = UserAttendanceDB.convertUserAttendanceInUserAttendanceDB(userAttendanceDB, attendance);
                    userAttendanceDao.insert(userAttendanceDB);
                    return Observable.empty();
                }
            });

}

Модификация

 private boolean configured = false;

private HttpLoggingInterceptor loggingInterceptor;
private CookieInterceptor cookieInterceptor;
private HeadersInterceptor headersInterceptor;

private Retrofit.Builder retrofitBuilder;

protected OkHttpClient.Builder httpClientBuilder;
private OkHttpClient httpClient;

@Inject
public ApiServiceProvider(Retrofit.Builder retrofitBuilder, OkHttpClient.Builder httpClientBuilder,
                          HttpLoggingInterceptor loggingInterceptor, CookieInterceptor cookieInterceptor,
                          HeadersInterceptor headersInterceptor) {

    this.httpClientBuilder = httpClientBuilder;
    this.retrofitBuilder = retrofitBuilder;
    this.loggingInterceptor = loggingInterceptor;
    this.cookieInterceptor = cookieInterceptor;
    this.headersInterceptor = headersInterceptor;
}

private void buildClient() {
    httpClientBuilder.addInterceptor(headersInterceptor);
    httpClientBuilder.addNetworkInterceptor(loggingInterceptor);
    httpClientBuilder.addInterceptor(cookieInterceptor);

    httpClient = httpClientBuilder.build();
}

@Override
public ApiService get() {
    if (!configured || httpClient == null) {
        buildClient();
        configured = true;
    }

    Retrofit retrofit = retrofitBuilder.client(httpClient).build();

    return retrofit.create(ApiService.class);
}

1 Ответ

0 голосов
/ 12 декабря 2018

Каково значение ВРЕМЕНИ?в секундах или миллисекундах?

 * @param   timeout the time, in milliseconds, before the call aborts
 * @return a {@code boolean} indicating if the address is reachable.
 * @throws IOException if a network error occurs
 * @throws  IllegalArgumentException if {@code timeout} is negative.
 * @since 1.5
 */
public boolean isReachable(int timeout) throws IOException {
    return isReachable(null, 0, timeout);
}

TIMEOUT - это общее имя, поэтому убедитесь, что оно импортировано правильно.

...