Рестлет для Android: внутренняя ошибка соединителя (1002) - ошибка истечения времени ожидания потока - PullRequest
2 голосов
/ 01 января 2011

Я пишу простое приложение для Android, которое общается с полноценным веб-сервисом, размещенным на движке приложений Google.Веб-сервис разработан с использованием фреймворка Restlet.Вот подробности моей среды:

  • Сторона сервера: Restlet v2.0.3 для GAE
  • Сторона Android: Restlet v2.0.3 для
  • Android Android: v2.2 Уровень API 8

В моем AndroidManifest.xml помещено следующее разрешение:

<uses-permission android:name="android.permission.INTERNET" /> 

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

Несколько дней назад я загрузил свой сервис в appspot GAE и перекомпилировал свое приложение для Android с этим новым URL-адресом.,Однако на этот раз мое приложение, похоже, вообще не подключается к этому веб-сервису.Он пытается подключиться и блокирует примерно минуту или около того и выдает эту ошибку в logcat:

12-27 15:14:52.856: ERROR/MyActivity(362): Internal Connector Error (1002) - The calling thread timed out while waiting for a response to unblock it.
12-27 15:14:52.856: ERROR/MyActivity(362):     at org.restlet.resource.ClientResource$1.invoke(ClientResource.java:1648)
12-27 15:14:52.856: ERROR/MyActivity(362):     at $Proxy7.getAvailableItems(Native Method)
12-27 15:14:52.856: ERROR/MyActivity(362):     at com.example.activities.MyActivity$1.run(MyActivity.java:94)

Я вызываю следующий метод веб-службы на GAE:

@Get
GetItemsResponse getAvailableItems(ItemCategory itemCategory);

Более того, я делаю это на стороне Android для привязки к веб-сервису:

    ClientResource clientResource = new ClientResource(myServiceUri);
    return clientResource.wrap(ItemsResource.class);

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

С другой стороны, в то время, когда приложение Android пытается подключиться к этому сервису, яя даже не вижу ни одного входящего запроса журнала в моей панели appspot.Похоже, что Android-запрос по какой-то причине даже не достигает GAE.

Вот как я делаю вызов веб-службы на стороне Android ...

  1. Звонок в Интернетобслуживание происходит в потоке с приоритетом по умолчанию.
  2. Этот поток создается и запускается в методе onStart моей основной деятельности.
  3. Между тем,Я отображаю диалог прогресса в потоке пользовательского интерфейса.
  4. Как только поток получает какой-либо ответ от веб-службы, он обновляет SharedPreferences с определенным значением.Если вызов возвращает какую-либо ошибку, он регистрирует эту ошибку и затем обновляет SharedPreferences со значением по умолчанию.
  5. Это вызывает моего слушателя SharedPreferences .Затем он отменяет диалоговое окно выполнения и отображает основной пользовательский интерфейс.

С тех пор, как я переместил этот сервис в appspot, поток всегда возвращается с исключением, которое я упомянул выше.

Я делаючто-то здесь не так?Почему происходит сбой вызова этой службы, когда я получаю к ней доступ из appspot?Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

-Кальян Акелла

Ответы [ 2 ]

1 голос
/ 27 мая 2011

У меня была такая же проблема (также на GAE-> Android)

Попробуйте использовать org.restlet.ext.net в качестве http-клиента. На restlet.org вам предлагается изменить клиентов следующим образом:

    Engine.getInstance().getRegisteredClients().add(new HttpClientHelper(null));

Однако я обнаружил, что это не работает, если вы не сделаете:

Engine.getInstance().getRegisteredClients().clear();
Engine.getInstance().getRegisteredClients().add(new HttpClientHelper(null));

Убедитесь, что на вашем пути сборки есть org.restlet.ext.net.jar, и убедитесь, что зарегистрированный HttpClientHelper действительно org.restlet.ext.net.HttpClientHelper.

Это решило проблему для меня при использовании последнего снимка рестлета, не уверенного, работает ли он в предыдущих выпусках.

Это также решило некоторые другие проблемы, которые у меня были с рестлетом:

  • 1001 ошибка при использовании HTTPS
  • Ошибка связи случайно при публикации данных
1 голос
/ 05 января 2011

У меня была похожая проблема с использованием рестлета 2.0.4 и Android 1.5. Все работало хорошо локально, но я получил такое же исключение по тайм-ауту после развертывания в GAE.

Я изменил аннотацию @Get на сервисе на @Put, и это сработало. Это объяснило мне, почему сервис работает из браузера. Я не знаю, почему в этом случае @Get не работает с развернутым приложением в GAE ...

...