我正在开发一个安卓应用程序,其中有两个按钮。这两个按钮处理线程返回的数据所以我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
对象有两个内置整数字段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
标记类型(线程已完成)。
我将使用在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;
}
};
希望这能有所帮助。