Перезапуск Android с ошибкой связи AppEngine - PullRequest
1 голос
/ 23 января 2012

У меня та же проблема, что и: http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2838513

Я пытаюсь создать очень простое приложение с обменом данными между GAE и Android, и я сталкиваюсь с той же проблемой.

У меня есть версия Android Snapshot 2.1 (2012-01-15) У меня есть версия 2.1 Snapshot (2012-01-15) gae

В классе Path of Android я имею:

  • org.restlet.ext.jackson
  • org.restlet
  • jackson-all.1.9.3

У меня есть общий источникпапка с моим приложением GAE для совместного использования ресурсов и компонентов

В classPath GAE у меня есть: * org.restlet.ext.jackson * org.restlet.ext.json * org.restlet.ext.servlet * org.restlet * jackson-all.1.9.3

Вот мой web.xml:

<servlet-name>RestletServlet</servlet-name>
<servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.application</param-name>
<param-value>com.binomed.server.rest.RestletApplication</param-value>
</init-param>
</servlet>
<!-- Catch all requests -->
<servlet-mapping>
<servlet-name>RestletServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>

Вот общий код:



    package com.binomed.client.rest;
    import org.restlet.resource.Get;
    import com.binomed.client.rest.dto.RestletObjectA;

    public interface IRestletService {

    @Get
    RestletObjectA getMessage() throws Exception;

    }

    package com.binomed.client.rest.dto;

    import java.io.Serializable;
    import java.util.List;

    public class RestletObjectA implements Serializable {



    /**
    * 
    */
    private static final long serialVersionUID = 1L;



    public RestletObjectA() {
    super();
    }



    private RestletObjectB objectB;

    private List listObjectB;

    private String name;


    public RestletObjectB getObjectB() {
    return objectB;
    }


    public void setObjectB(RestletObjectB objectB) {
    this.objectB = objectB;
    }


    public List getListObjectB() {
    return listObjectB;
    }



    public void setListObjectB(List listObjectB) {
    this.listObjectB = listObjectB;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    }

    package com.binomed.client.rest.dto;

    import java.io.Serializable;

    public class RestletObjectB implements Serializable {



    /**
    * 
    */
    private static final long serialVersionUID = 1L;

    public RestletObjectB() {
    super();
    }

    private String name;

    public String getName() {
    return name;
    }



    public void setName(String name) {
    this.name = name;
    }

    }


А вот иреализация моего сервиса:



    package com.binomed.server.rest;

    import java.util.ArrayList;

    import org.restlet.resource.Get;
    import org.restlet.resource.ServerResource;

    import com.binomed.client.rest.IRestletService;
    import com.binomed.client.rest.dto.RestletObjectA;
    import com.binomed.client.rest.dto.RestletObjectB;

    public class RestResource extends ServerResource implements IRestletService {



    @Override
    @Get
    public RestletObjectA getMessage() throws Exception {
    RestletObjectB objB = new RestletObjectB();
    objB.setName("ObjectB");

    RestletObjectA result = new RestletObjectA();
    result.setName("ObjectA");
    result.setListObjectB(new ArrayList());
    result.getListObjectB().add(objB);
    result.setObjectB(objB);

    return result;
    }

    }


и



    package com.binomed.server.rest;

    import org.restlet.Application;
    import org.restlet.Restlet;
    import org.restlet.routing.Router;

    public class RestletApplication extends Application {



    /**
    * Creates a root Restlet that will receive all incoming calls.
    */
    @Override
    public Restlet createInboundRoot() {
    // Create a router Restlet that routes each call to a
    // new instance of HelloWorldResource.
    Router router = new Router(getContext());

    // Defines only one route
    // router.attachDefault(new Directory(getContext(), "war:///"));
    // router.attach("/test/", RestResource.class);
    router.attachDefault(RestResource.class);

    return router;
    }

    }


Если я попробую URL: http://localhost:8888/rest/, он работает, у меня есть {"objectB": {"name":" ObjectB "}," listObjectB ": [{" name ":" ObjectB "}]," name ":" ObjectA "} в качестве возврата, что в целом нормально.

Вот мой код Android:



    // Use an AsyncTask to avoid blocking the UI thread
    new AsyncTask() {

    @Override
    protected RestletObjectA doInBackground(Void... arg0) {
    try {
    return RestletAccesClass.callService();
    } catch (Exception e) {
    Log.e(TAG, "Error during calling rest server", e);
    return null;
    }
    }
    @Override
    protected void onPostExecute(RestletObjectA result) {
    if (result != null) {
    restlet.setText(result.getName() + ", B : " + result.getObjectB().getName());
    } else {
    restlet.setText("Failure during getting result");
    }
    btnRestlet.setEnabled(true);
    }
    }.execute();


and : 
    

    public static RestletObjectA callService() throws Exception {
    ClientResource clientResource = new ClientResource(TestRpcAndroidActivity.LOCALHOST + "/rest/");

    IRestletService service = clientResource.wrap(IRestletService.class);
    RestletObjectA result = service.getMessage();
    return result;
    }

С проектом Android у меня всегда есть следующееg ошибка:

01-23 14:09:12.594: E/TestAndroidActivity(1620): Error during calling rest server
01-23 14:09:12.594: E/TestAndroidActivity(1620): Communication Error (1001) - The connector failed to complete the communication with the server
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at org.restlet.resource.ClientResource.doError(ClientResource.java:579)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at org.restlet.engine.resource.ClientInvocationHandler.invoke(ClientInvocationHandler.java:233)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at $Proxy5.getMessage(Native Method)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at com.binomed.android.rpc.rest.RestletAccesClass.callService(RestletAccesClass.java:14)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at com.binomed.android.rpc.TestRpcAndroidActivity$3.doInBackground(TestRpcAndroidActivity.java:153)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at com.binomed.android.rpc.TestRpcAndroidActivity$3.doInBackground(TestRpcAndroidActivity.java:1)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
01-23 14:09:12.594: E/TestAndroidActivity(1620):    at java.lang.Thread.run(Thread.java:1096)

У вас была идея, как решить эту проблему?

regards

1 Ответ

1 голос
/ 23 января 2012

Не могли бы вы попробовать добавить клиентский соединитель на основе Apache HTTP Client вместо внутреннего (который еще не полностью стабилен)?См. Инструкции здесь: http://wiki.restlet.org/docs_2.1/13-restlet/275-restlet/266-restlet.html

Обратите внимание, что мы намерены устранить проблемы со стабильностью этого разъема для версии 2.1.0.

...