2013-07-05 3 views
1

Я работаю с http-based API и хочу знать, когда я сталкиваюсь с любыми ошибками. Я использую Android-запрос (заглушки):Как определить, когда не удалось выполнить обратный вызов Android-запроса?

AjaxCallback<JSONObject> cb = new AjaxCallback<JSONObject>() { 
     @Override 
     public void callback(String url, JSONObject json, AjaxStatus status) { 
      try { 
       if (json != null) { 
        if (json.getString("authenticated") != "true") 
         // An error, but status=200 and json!=null 

      } catch (JSONException e) { errors... } } }; 

И я использую это так:

final AQuery aq = new AQuery(this); 
    aq.ajax(url, JSONObject.class, cb); 
    cb.block(); 

Мои вопросы:

  • Я обнаружил, что использование cb.block() - единственный способ заставить библиотеку работать синхронно, но я не уверен, что это лучший способ (похоже, это не так).
  • Метод обратного вызова не может генерировать исключения, не может возвращать что-либо (void) и т. Д., Так что лучший способ обработки ошибок? Я заметил, что он поддерживает cb.getResult(), но похоже, что вызов этого метода приводит к возврату внешнего блока (я не могу его объяснить).

Спасибо.

+0

'блок()' плохой способ, m'kay ... [обратный вызов терпит неудачу, когда 'json' является нулевым] (https://code.google.com/p/android-query/# JSON_Example) ... я не уверен, но вы также можете проверить 'status' – Selvin

+0

@Selvin Любое предложение вместо block()? Я хочу дождаться завершения транзакции и позволить UI знать, что у нее есть объекты для отображения. – asafge

+0

введите свой код в 'AjaxCallback .callback (...)' – Selvin

ответ

3

Итак, после того, как я провел некоторое время с библиотекой, похоже, что он поддерживает синхронные HTTP-запросы. Хотя я согласен с тем, что это не самая лучшая практика для большинства случаев, говоря, что это плохая идея, вообще игнорирует некоторые условия, которые могут потребовать ее. В моем случае я зависим от других библиотек, которые я не могу контролировать, и это отключено от потока пользовательского интерфейса, так что все в порядке.

AjaxCallback<JSONObject> cb = new AjaxCallback<JSONObject>(); 
final AQuery aq = new AQuery(this); 
cb.url(url).type(JSONObject.class); 
aq.sync(cb); 

JSONObject json = cb.getResult(); 
AjaxStatus status = cb.getStatus(); 
if (json != null && statusValid(status)) { 
    // parse json object, throw if fails, etc. 
} 

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

  • Нет связанных вопросов^_^