Java:来自同一HTTPClient的多个HTTP请求?

时间:2015-01-30 23:37:39

标签: java android apache request httpclient

目前,在我的代码中,我有一个类SocketOperator,它运行在由静态http客户端支持的单例模式上。这意味着每当我同时在多个地方调用SocketOperator.getInstance()。makeGetRequest()时,请求就会混淆(例如:A调用方法,B调用方法,B得到A的结果)。

我的解决方案是什么?具体来说,我如何修改HTTPClient,以便当我从不同的源发出多个请求时,每个源都会得到相应的响应?

2 个答案:

答案 0 :(得分:1)

您似乎未正确使用Singleton模式,或尝试将其应用于非线程安全的API。

除非您执行回调方法或自行管理线程,否则您将无法为不同的客户端使用相同的流对象。您应该仅使用Singleton来保存整个程序通用的数据,确保程序中任何时候只存在一个类的实例。

简化:使用Singleton存储公共数据,并为每个客户端使用不同的流实例。

我做了一个简单(但功能性)的例子,演示了如何正确使用Singleton模式来解决连接问题。 Singleton仅用于保留整个系统通用的缓存信息。在这种情况下,URL,但您可以添加安全性和其他优化。

public class SocketOperator {

    private final static SocketOperator SOCKET_OPERATOR = new SocketOperator();
    private String url;

    private SocketOperator() {
        // Caches URL, authentication, etc... Usually loaded from database or properties file.
        url = "http://www.thomas-bayer.com/sqlrest/CUSTOMER/";
    }

    public static SocketOperator getInstance() {
        return SOCKET_OPERATOR;
    }

    public String makeGetRequest() throws Exception {
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        return response.toString();
    }
}

答案 1 :(得分:0)

我猜您遇到了麻烦,因为您正在为两者使用相同的听众,或者如果请求来自A或B,您将无法重新收集。

因此,当您触发请求时,您可能希望提供已通知的回调,并使用包含URL,状态代码等请求的元信息的响应执行某些操作...

除此之外,您应该开始考虑使用HttpURLConnection而不是默认的HttpClient。原因是因为从Gingerbread开始,以前的解决方案是获得更新的解决方案,它肯定更灵活。

如果你不想投入时间独自完成所有事情,可以选择Square,Volley等改造品......