2012-03-12 56 views
1

我正在开发一个有2个按钮的android应用程序。 这两个按钮由一个线程返回 所以我1)启动一个新的线程2)禁止调用子程序 下面的按钮3)中的数据的工作是针对在java中的线程和标志之间交换多个对象

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

      } 
     }).start(); 

1.My代码第一问题是我怎么能知道子线程已经完成,以便我可以重新启用按钮? 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; 

     } 
    }; 

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

请帮我一把。

回答

0

Message对象有两个buildin整数字段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(线程完成)。

2

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

0

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

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; 

    } 
}; 

希望这有助于。

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



}