有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

目前,在我的代码中,我有一个类SocketOperator,它在静态http客户机支持的单例模式上运行。这意味着每当我调用SocketOperator时。getInstance()。makeGetRequest()在多个位置同时执行时,请求可能会混淆(例如:A调用方法,B调用方法,B获取A的结果)

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


共 (2) 个答案

  1. # 1 楼答案

    您似乎不正确地使用了单例模式,或者试图将其应用于非线程安全的API

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

    简单一点:使用单例存储公共数据,并为每个客户机使用不同的流实例

    我制作了一个简单的(但功能性的)示例,演示如何正确使用单例模式来解决连接性问题。单例仅用于保存整个系统共用的缓存信息。在本例中,您可以更改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();
        }
    }
    
  2. # 2 楼答案

    我猜您遇到了麻烦,因为您对这两个应用程序使用了相同的侦听器,或者您无法回忆请求是来自A还是B

    因此,当您启动请求时,您可能希望提供一个回调,该回调会收到通知,并使用包含有关请求的一些元信息(如URL、状态代码等)的响应执行某些操作

    此外,您应该开始考虑使用{A1}来代替默认的HTTPcli客户。原因是,从姜饼开始,前一种解决方案将得到更新,而且它肯定更灵活

    如果你不想自己花时间做每件事,有其他的选择,如广场改造,凌空