0

我目前在 Android 上使用 Restlet 2.1.2,我想知道如何在我的应用程序中重用实例 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);

“启动内部 [HTTP/1.1] 客户端” “启动内部 [HTTP/1.1] 客户端”

如您所见,在 ClientResource 的每个新实例化时,它都会创建新客户端。我只想保留 1 个客户端资源,然后使用相同的实例向服务器发出少量请求。

最好的方法是什么?

另一点:我使用#setNext() 方法来保留客户端,但我觉得这没用。因为它无论如何都会创建另一个客户端。

此致

4

2 回答 2

0

这就是我使用 restlet 2.3.1 在我的 android 应用程序中解决这个问题的方法。我为我想要访问的 url、segment 和参数创建了一个参考。然后在 ClientResource 上使用 .setReference()。这样,您可以创建一个 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();
    }
}
于 2015-04-28T20:48:19.467 回答
0

您应该删除对 release() 的调用,该调用具有停止客户端连接器的效果,然后由第二个客户端资源再次自动启动。

于 2013-05-14T20:47:18.820 回答