2013-05-10 1 views
0

В настоящее время я использую Restlete 2.1.2 на Android, и я хотел бы знать, как повторно использовать экземпляр Clientresource в моем приложении.Как повторно использовать org.restlet.resource.ClientResource

Вот код, я использую:

Client client = new Client (new Context(), Protocol.HTTP); 
    ClientResource clientResource ClientResource = new ("http://codeblow.com/"); 
    clientResource.setNext (client); 
    // Executors.newCachedThreadPool ExecutorService pool =(); 

    clientResource.get(); 
    clientResource.release(); 

    ClientResource clientResource1 ClientResource = new ("http://codeblow.com/"); 
    clientResource.setNext (client); 

"Запуск [1.1/HTTP] клиент внутренний" "Запуск внутреннего [HTTP/1.1] клиент"

Как вы можете видеть, при каждом новом экземпляре ClientResource он создает новых клиентов. Я просто хочу сохранить 1 clientresource, а затем сделать несколько запросов с тем же экземпляром на сервере.

Каков наилучший способ сделать это?

Другой момент: я использовал метод #setNext(), чтобы поддерживать клиент, но я чувствую, что это бесполезно. Потому что он все равно создает другого клиента.

С наилучшими пожеланиями

ответ

0

Вы должны удалить вызов Release(), которая имеет эффектную остановить разъем клиента, который затем запускается автоматически снова второй клиентский ресурс.

0

Вот как я решил эту проблему в своем приложении для Android с помощью restlet 2.3.1. Я создал ссылку для URL-адреса, сегмента и параметров, к которым я хотел получить доступ. Затем используется .setReference() на ClientResource. Таким образом, вы можете создать один экземпляр ClientResource и повторно использовать параметр .setReference() для изменения параметров. Этот подход будет только запускать и останавливать HTTP-клиент один раз.

Ниже приведен фрагмент кода, который показывает эту идею. Этот код использовал ответы IntentService и JSON, но они не требуются. Я не включил код для объектов Resource, потому что он напрямую не связан с вопросом.

import org.restlet.data.Reference; 
import org.restlet.engine.Engine; 
import org.restlet.ext.jackson.JacksonConverter; 
import org.restlet.resource.ClientResource; 

public class MyDataService extends IntentService { 
    private static final String CLOUD_DATA_ENDPOINT = "http://my.server-app.com"; 
    private ClientResource cr = null; 

    protected void onHandleIntent(Intent intent) { 
     cr = getClientResource(); 

     UserObj = retrieveUser("myuserid"); 
     AccountObj = retrieveAccount("myacctid"); 

     cr.release(); 
    } 

    private ClientResource getClientResource() { 
     Engine.getInstance().getRegisteredConverters() 
       .add(new JacksonConverter()); 

     // Initialize the resource proxy. 
     ClientResource cr = new ClientResource(CLOUD_DATA_ENDPOINT); 

     // Workaround for GAE servers to prevent chunk encoding 
     cr.setRequestEntityBuffering(true); 
     cr.accept(MediaType.APPLICATION_JSON); 

     return cr; 
    } 

    private UserObj fetchUser(String userID){ 
     Reference queryRef = new Reference(CLOUD_DATA_ENDPOINT); 
     queryRef.addSegment("user"); 
     queryRef.addQueryParameter(QueryResource.FIELD_USER_ID, userID); 
     cr.setReference(queryRef); 

     UserResource resource = cr.wrap(UserResource.class); 

     // may return null or empty object 
     return resource.retrieve(); 
    } 

    private AccountObj fetchAccount(String accountID){ 
     Reference queryRef = new Reference(CLOUD_DATA_ENDPOINT); 
     queryRef.addSegment("account"); 
     queryRef.addQueryParameter(QueryResource.FIELD_ACCOUNT_ID, accountID); 
     cr.setReference(queryRef); 

     AccountResource resource = cr.wrap(AccountResource.class); 

     // may return null or empty object 
     return resource.retrieve(); 
    } 
}