从服务器请求JSON时客户端冻结

时间:2013-08-02 21:48:35

标签: java ajax multithreading

我有一个Java程序,它将在当前的高峰时段冻结。我在寻找原因。现在,我的想法是因为有些代码不是AJAX,所以当在高峰时间从服务器请求JSON对象时它会挂起(在高峰期间Internet速度很慢)。但我不太确定它不是AJAX。我不能在这里粘贴所有代码,因为它与公司的属性有关,所以我要编写一些代码/伪代码。该程序使用以下命令来执行请求。

 URL url = new URL("http://www.xxxxxxxx.com/");
 URLConnection conection = url.openConnection();
 BufferedReader in = new BufferedReader(new InputStreamReader(conection .getInputStream()));
 String inputLine;
 String content = "";
 while ((inputLine = in.readLine()) != null) { 
            content += inputLine;
        }
 in.close();
 json = new JSONObject(content);

以上代码是该程序的一些片段,我认为它会导致冻结。我的问题是,这段代码似乎没有使用任何AJAX而且它不是多线程的,对吧?因此,当互联网连接非常慢时,它会挂在那里(冻结)?我对此并不是很有经验。请帮忙。

如果你认为这不是造成冻结的主要原因,那么一般来说,这可能是造成这种问题的最可能原因。 提前谢谢。

编辑/更新:

  1. 我的程序是一个在客户端运行的swing程序。没有 此应用程序的真实服务器端代码。 URL地址是 第三方服务器,提供程序的某种数据 需要。我没有看到程序使用任何线程。它基本上是核心Java,没有使用我看到的任何线程,我不是很熟悉多线程,所以我不确定。 (该程序不是由我编写的,它是由一些以前的程序员编写的)这就是为什么我在考虑它可能没有使用其他线程来运行这个服务器请求的时候。

  2. 冻结的意思是在尝试运行某些特定功能的高峰时段,UI会冻结几秒钟。我写的上面的代码是这些函数的一些片段。用户界面冻结一段时间后,其余部分按预期工作。然而,在非高峰时段,它就像一个魅力。

  3. 具体来说, BufferedReader in = new BufferedReader(new 我认为InputStreamReader(conection .getInputStream())); 这会导致问题。任何人都可以确认吗?

2 个答案:

答案 0 :(得分:1)

  • 所有异步方法,如HTTP POST / GET,都在单独的Thread中实现。用户无需查看您的应用程序在后台执行的操作。

  • 此外,如jlordo所说,使用String进行追加是不好的做法,使用StringBuilderStringBuffer

    StringBuilder buff = new StringBuilder(); while((inputLine = in.readLine())!= null){

        if(!"".equals(line).trim){
            buff.append(line).append("\n");
         }           
    }
    

    in.close();

  • 您可以为会话添加超时,以确保应用程序根本不会卡住。

<强> [编辑]

关于问题的变化,我不认为

  

BufferedReader in = new BufferedReader(new InputStreamReader(conection .getInputStream()));

这是你的问题。

您可以尝试执行后续流程,但我仍然考虑使用GUI线程单独的线程

InputStream is = conection .getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ( (line = br.readLine()) != null) {

答案 1 :(得分:1)

您可能希望使用SwingWorker线程来执行对服务器的调用。这样,当它忙时,UI就不会冻结。

但是,请记住,在新数据到达之前,您不会在屏幕上看到新数据提供的更改。

请参阅Oracle SwingWorker JavaDocs

example similar to yours

教程