Как обновить пользовательский интерфейс после завершения потока вызовов веб-службы - PullRequest
2 голосов
/ 21 декабря 2011

Вопросов о потоках нет, я знаю, но я не могу найти "полный" пример потока, выполняющего работу http и затем возвращающегося для обновления пользовательского интерфейса.

Обычно я запускаю несколько веб-служб при запуске приложения Я явно не хочу замораживать пользовательский интерфейс, поэтому я бы хотел использовать отдельный поток, верно? Я нашел в сети несколько примеров того, как получить новый поток для выполнения некоторой задачи. Но я еще не нашел тот, который показывает, как на самом деле обновить пользовательский интерфейс после выполнения задачи потока.

Как узнать, когда закончится поток веб-службы? Есть ли метод обратного вызова? Могу ли я получить доступ к интерфейсу из этого метода обратного вызова, если таковой существует.

Редактировать: (Вот код)

//The activate method is called whenever my application gains focus.

public void activate(){

    DoSomething wsThread = new DoSomething();
    wsThread.start();
}

public void wsCallBack()
{
    myTabScreen.add(new ButtonField("Callback called"));
}

public class DoSomething extends Thread
{
    public void run()
    {
        try
        {
            wsCallBack();
        }
        catch(Exception e)
        {

        }           
    }
}

Очень просто. Но он никогда не создает кнопку.

Есть идеи?

Большое спасибо.

1 Ответ

3 голосов
/ 21 декабря 2011

Вы можете настроить систему «обратного вызова», чтобы уведомлять пользовательский интерфейс о завершении потоков. Иметь класс, расширяющий Thread, и передавать ему ссылку на класс, который должен быть вызван в конце. Если у вас есть список таких классов, о которых нужно уведомить, создайте Vector в реализации Thread для их хранения. Переопределите функцию run и, выполнив все, что вам нужно сделать, просто вызовите метод класса UI (итерируя вектор, если это необходимо). Таким образом, ваши занятия могут выглядеть так:

public class commThread extends Thread{

   MyUIClass callbackObj;

   public commThread(MyUIClass myUiClass){
      callbackObj = myUiClass;
   }

   public void run(){
      //do stuff
      callbackObj.callback();
   }

}

и ваш класс пользовательского интерфейса:

public MyUIClass{

   public void callback(){
   //refresh the UI
   }
}

Конечно, если у вас несколько потоков, работающих одновременно и вызывающих один и тот же объект пользовательского интерфейса, обязательно синхронизируйте метод обратного вызова.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...