обмен нескольких объектов между потоками и флагами в Java - PullRequest
1 голос
/ 12 марта 2012

Я разрабатываю приложение для Android, в котором есть 2 кнопки. Эти две кнопки работают с данными, возвращаемыми потоком Итак, я 1) начинаю новый поток 2) Отключаем кнопки 3) Вызываем подпрограмму Вот код для этого

new Thread(new Runnable(){
            public void run() {
                getPolls();
                answer.setEnabled(false);
                review.setEnabled(false);

            }
        }).start();

1. Мой первый вопрос: как я могу узнать, что дочерняя нить завершена, чтобы я мог снова включить кнопки? 2. Метод getPolls (), вызываемый в потоке, создает arrayList. Я возвращаю его через обработчик следующим образом

//Sending the filled poll questions data to the main thread
        Message qemsg = messageHandler.obtainMessage();

        qemsg.obj=poll;

        messageHandler.sendMessage(qemsg);

Код обработчика сообщений:

//Message Handler to get messages from the thread
    private Handler messageHandler = new Handler() {
      public void handleMessage(Message msg) {
          polldata=(ArrayList<PollQuestion>) msg.obj;

      }
    };

Я сомневаюсь, как я могу отправить два разных объекта с помощью обработчика сообщений?

Пожалуйста, помогите мне.

Ответы [ 4 ]

2 голосов
/ 12 марта 2012

Я бы создал синглтон , а затем в вашем обратном вызове установил логическое значение, чтобы показать, когда оно закончится.Затем вы можете получить доступ к этому синглтону из любой части вашего кода, чтобы проверить, выполнено ли это.Другим способом был бы таймер.Настройте таймер, чтобы проверить, выполнено ли это, и обновить кнопки.

1 голос
/ 12 марта 2012

Я бы согласился с предложением Джеймса Холлоуэя об одноэлементной игре, чтобы у вас был некоторый контроль над тем, с какой нитью вы разговариваете.

Что касается отправки различных сообщений, их можно идентифицировать с помощью поля Message.what

qemsg.what = MY_CONST_ID;

В обработчике вы можете найти тип отправленного вами сообщения и соответственно расшифровать его

public void handleMessage(Message msg){
    switch (qmsg.what)
    {

    case MY_CONST_ID:
        //process your message here 
        break;
    }



}
0 голосов
/ 12 марта 2012

Объект Message имеет два встроенных целочисленных поля: arg1, arg2 и what (см. http://developer.android.com/reference/android/os/Message.html).. Используйте их для различения сообщений различного типа в обработчике. Пример:

public static final int TYPE1 = 1;  // use a better name ...
public static final int TYPE2 = 2;
public void handleMessage(Message msg) {
    switch(msg.what) {
         case TYPE1: polldata=(ArrayList<PollQuestion>) msg.obj; break;
         case TYPE2: ...
      }
}

Чтобы сообщить, что поток завершен, рассмотрите возможность использования еще одного сообщения и отметьте тип (поток завершен), используя what.

0 голосов
/ 12 марта 2012

Я бы использовал статический ArrayList, который вы инициализируете в getPolls (). В вашем методе handleMessage установите ваши polldata равными статическому ArrayList. Например, создайте класс с именем Constants:

public class Constants{
     static ArrayList<PollQuestions> constPolls;
}

в getPolls () установить Constants.constPolls

    Message qemsg = messageHandler.obtainMessage();

    //qemsg.obj=poll;
    // no need to set an object.

    messageHandler.sendMessage(qemsg);

Затем обработайте сообщение:

//Message Handler to get messages from the thread
private Handler messageHandler = new Handler() {
  public void handleMessage(Message msg) {
      polldata=Constants.constPolls;

  }
};

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

...