目前,在我的代码中,我有一个类SocketOperator,它运行在由静态http客户端支持的单例模式上。这意味着每当我同时在多个地方调用SocketOperator.getInstance()。makeGetRequest()时,请求就会混淆(例如:A调用方法,B调用方法,B得到A的结果)。
我的解决方案是什么?具体来说,我如何修改HTTPClient,以便当我从不同的源发出多个请求时,每个源都会得到相应的响应?
答案 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等改造品......