2015-05-05 3 views
1

Я столкнулся с странным поведением. Мое приложение имеет основное действие, которое состоит из макета навигатора и фрагмента списка по умолчанию. В фрагменте списка используется клиент Retrofit для извлечения содержимого. Детальный вид отображается, когда выбран элемент списка. На маленьком экране детальный вид загружается через отдельное действие. Эта активность также использует клиента «Дооснащение» для получения подробной информации. Затем есть один параметр, который можно выбрать из navdrawer, который генерирует новое действие. Эта активность также использует Retrofit-клиент для отправки данных.Что может заставить Retrofit игнорировать вызов метода?

Действия в списке и деталях invoke. Модифицировать методы просто отлично. Я вижу журналы, и все работает так, как ожидалось. Тем не менее, третье действие, открытое с помощью опции навигации, пытается вызвать методы клиента Retrofit, которые игнорируются Retrofit.

Во всех случаях клиент дооснащения конкретизируется таким же образом:

protected ServerApi buildApi(String serverEndpoint) { 
    Gson gson = new GsonBuilder() 
      .create(); 

    RestAdapter restAdapter = new RestAdapter.Builder() 
      .setLog(new AndroidLog("ServerApi")) 
      .setLogLevel(RestAdapter.LogLevel.FULL) 
      .setEndpoint(serverEndpoint) 
      .setErrorHandler(new ApiErrorHandler()) 
      .setConverter(new GsonConverter(gson)) 
      .build(); 

    return restAdapter.create(ServerApi.class); 
} 

В списке и детализации деятельности, можно увидеть записи журнала многословным дооснащения. Однако, когда я делаю вызов аналогично сконфигурированного клиента Retrofit в третьем действии, никаких журналов не выходит, ошибка не возникает, logcat ничего не печатает. Его почти как вызов игнорируется.

Я уверен, что конечная точка сервера правильно установлена, и я также гарантирую, что вызов выполнен. Сначала я думал, что это может быть связано с созданием клиента в onCreate и выполняется в отдельном потоке. Однако создание тестового вызова сразу после создания клиента не приводит к каким-либо результатам.

Кто-нибудь знает, что может вызвать такое нечетное поведение только в одном действии, а не в остальном?

UPDATE 1

Да, я пытался войти везде. Мой более отчаянным дооснащения клиент сборки выглядит следующим образом:

protected class ApiErrorHandler implements ErrorHandler { 
    @Override 
    public Throwable handleError(RetrofitError cause) { 
     Log.e(TAG, "Got API error " + cause); 

     Response r = cause.getResponse(); 
     Throwable throwable = null; 

     if (r == null) { 
      return cause; 
     } 

     // Try to interpret the response 
     String responseBody = new String(((TypedByteArray) r.getBody()).getBytes()); 
     Gson gson = new GsonBuilder().create(); 
     BaseResponse response = null; 

     try { 
      response = gson.fromJson(responseBody, BaseResponse.class); 
     } 
     catch (Exception e) { 
      Log.e(TAG, "Could not parse the error response:" + e.getMessage()); 
     } 

     return new ServerApiException(response.getErrorMessage()); 
    } 
} 

protected class ApiRequestInterceptor implements RequestInterceptor { 
    @Override 
    public void intercept(RequestFacade request) { 
     Log.d(TAG, "Intercepted API request: " + request.toString()); 
    } 
} 

RestAdapter restAdapter = new RestAdapter.Builder() 
    .setLog(new AndroidLog("ServerApi")) 
    .setLogLevel(RestAdapter.LogLevel.FULL) 
    .setEndpoint(mServerUrl) 
    .setErrorHandler(new ApiErrorHandler()) 
    .setConverter(new GsonConverter(gson)) 
    .setRequestInterceptor(new ApiRequestInterceptor()) 
    .setProfiler(new Profiler() { 
     @Override 
     public Object beforeCall() { 
      Log.d("RetrofitProfiler", "Before call to retrofit"); 
      return null; 
     } 

     @Override 
     public void afterCall(Profiler.RequestInformation requestInfo, long elapsedTime, int statusCode, Object beforeCallData) { 
      Log.d("RetrofitProfiler", String.format("HTTP %d %s %s (%dms)", 
        statusCode, requestInfo.getMethod(), requestInfo.getRelativePath(), elapsedTime)); 
     } 
    }) 
    .build(); 

UPDATE 2

Хорошо, я был неправ, но не знал, что дооснащения полагались по крайней мере, на одного абонента будет присутствовать. Думаю, это имеет смысл, теперь, когда я думаю об этом ... но это не огонь и не забыть.

Что я делаю неправильно:

mClient = new ServerClient(mServerEndpoint, mAccountToken); 
mUvClient.getFeed(mFeedId); 

Это часть я не знаю. Вы должны подписаться на наблюдаемый для того, чтобы выполнить:

mClient = new ServerClient(mServerEndpoint, mAccountToken); 
mUvClient.getFeed(mFeedId) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Subscriber<FeedInfo>() { 
     @Override 
     public void onNext(FeedInfo feedInfo) { 
      Log.d(TAG, "on Next"); 
     } 

     @Override 
     public void onCompleted() { 
      Log.d(TAG, "on completed"); 
     } 

     @Override 
     public void onError(Throwable e) { 
      Log.d(TAG, "on error"); 
     } 
    }); 

Это дает ожидаемые ДООСНАСТКЕ подробные журналы и результат. Во всяком случае, я надеюсь, что это поможет кому-то.

+0

Вы регистрируете что-нибудь в своем ErrorHandler? – GreyBeardedGeek

+0

@GreyBeardedGeek Я обновил сообщение с помощью сборки, которую я использовал, чтобы попытаться вообще зарегистрировать. – Vadym

+0

@GreyBeardedGeek Я решил это ... в основном, я деконструировал свою активность до минимума: onCreate with setContentView и клиентская реализация. Это не дало результата.Затем я подумал: «Может быть, мне нужно указать, где происходит подписка». Это тоже не сработало. Наконец, я подумал, почему не подписываться и не видеть. Это сработало: / – Vadym

ответ

0

Проблема заключалась в том, что я не подписывался на Observable, сгенерированный Retrofit API. Я предположил, что он все равно выстрелит, но это не так и требует подписки. Надеюсь, это поможет любому, кто может столкнуться с этой проблемой.

Смежные вопросы