Java Apache httpclient, блокирующий графический интерфейс - PullRequest
0 голосов
/ 23 августа 2011

В настоящее время я разрабатываю приложение HTTP с использованием API-интерфейса HTTP Apache и использую графический интерфейс.После каждого запроса GET или POST я хочу обновить GUI TextArea несколькими сообщениями.Проблема в том, что эти сообщения появляются после выполнения всех запросов.

Я также заметил, что если я пишу сообщения на консоли после каждого запроса, сообщение появляется, но если я пишу в GUI, все сообщения появляются в конце.

Вот некоторый кодфрагменты:

Конструктор GUI:

public GUI() {
        initComponents();
        SetMessage.gui = this;
}

Класс SetMessage:

public class SetMessage implements Runnable{

    public static GUI gui;
    private String msg;

    public SetMessage( String msg){
        synchronized(gui){
            this.msg = msg;
        }
    }

    public void run() {
        gui.setText(msg);
    }

}

Класс запросов GET (каждый запрос выполняется потоком):

public class SendGetReq extends Thread {

private HttpConnection hc = null;
private DefaultHttpClient httpclient = null;
private HttpGet getreq = null;
private int step = -1;
private String returnString = null;

public SendGetReq(HttpConnection hc, DefaultHttpClient httpclient, HttpGet getreq, int step) {
    this.hc = hc;
    this.httpclient = httpclient;
    this.getreq = getreq;
    this.step = step;
}

@Override
public void run() {
   // CODE
}

И класс HttpConnection (экземпляр этого класса создается, когда я нажимаю кнопку в графическом интерфейсе):

    public class HttpConnection {
        private DefaultHttpClient httpclient = null;
        private HttpGet getreq = null;
        private HttpPost postreq = null;
private SendGetReq tempGet = null;
         // More fields
        private void RandomMethod(){
//Initialize getreq
(tempGet = new SendGetReq(this, httpclient, getreq, 0)).start();
new SetMessage("Message").run();

}

О!И метод SetText в GUI:

public synchronized void setText(String msg){
        if(!"".equals(msg)){
            Date currentDate = new Date();
            Calendar calendar = GregorianCalendar.getInstance();
            calendar.setTime(currentDate);
            jTextArea1.append(calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND)+" --- "+msg+"\n");                        
        }
    }

Может кто-нибудь помочь мне с этой проблемой?Спасибо!}

1 Ответ

1 голос
/ 23 августа 2011

Да, довольно стандартное поведение для графического интерфейса.Вам нужно будет выполнить HTTP-запросы в другом потоке, а затем уведомить поток GUI об обновлении пользовательского интерфейса.В частности, Swing требует, чтобы пользовательский интерфейс обновлялся из одного потока, а точнее - потока диспетчеризации событий.

См. SwingUtilities#isEventDispatchThread(), SwingUtilities#invokeLater() и класс SwingWorker.

...