在java中的线程和标志之间交换多个对象

时间:2012-03-12 14:25:03

标签: java android android-layout android-intent android-widget

我正在开发一个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 个答案:

答案 0 :(得分:2)

我会创建a singleton,然后在你的回调中设置一个布尔值来显示它何时完成。然后,您可以从代码的任何部分访问此单例,以检查它是否已完成。另一种方式是计时器。设置计时器以检查它是否完成并更新按钮。

答案 1 :(得分:1)

我会赞同詹姆斯霍洛威对单身人士的建议,这样你就可以控制你正在谈论的线索。

至于发送不同的消息,可以使用Message.what字段识别它们

qemsg.what = MY_CONST_ID;

在处理程序中,您可以找到您发送的消息类型并相应地对其进行解码

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

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



}

答案 2 :(得分:0)

我会使用你在getPolls()中初始化的静态ArrayList。在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;

  }
};

希望这有帮助。

答案 3 :(得分:0)

Message对象有两个构建整数字段arg1arg2以及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标记类型(已完成线程)。