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



我正在开发一个安卓应用程序,其中有两个按钮。这两个按钮处理线程返回的数据所以我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;
      }
    };

我的疑问是如何使用消息处理程序发送两个不同的对象?

请帮帮我。

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

我赞同James Holloway关于单例的建议,这样你就可以控制与哪个线程进行对话。

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

qemsg.what = MY_CONST_ID;

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

public void handleMessage(Message msg){
    switch (qmsg.what)
    {
    case MY_CONST_ID:
        //process your message here 
        break;
    }

}

Message对象有两个内置整数字段arg1arg2what(请参见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标记类型(线程已完成)。

我将使用在getPolls()中初始化的静态ArrayList。在handleMessage方法中,将polldata设置为等于静态ArrayList。例如,创建一个名为Constants:的类

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

在getPolls()中设置Constants.consPolls

    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;
  }
};

希望这能有所帮助。

最新更新