我在Thread外面有一个布尔值。然后我使用一个方法,需要一个返回布尔值的线程。如何使用返回的布尔值在线程外部设置布尔值?
代码:
// Handle Automatic E-Mail Sending in a new Thread
new Thread(new Runnable() {
@Override
public void run() {
// Since we want to display a Toast from within a different Thread,
// we need to use the runOnUiThread to display it
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(ChecklistActivity.cActivity, D.T_SENDING_EMAIL, Toast.LENGTH_LONG).show();
}
});
/*TODO: emailSuccessfullySent = */EMailSender.SendEmail();
}
}).start();
我已经阅读过某个地方,我可以使用最终数组这样做:
final boolean[] array = new boolean[1];
// Handle Automatic E-Mail Sending in a new Thread
new Thread(new Runnable() {
@Override
public void run() {
// Since we want to display a Toast from within a different Thread,
// we need to use the runOnUiThread to display it
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(ChecklistActivity.cActivity, D.T_SENDING_EMAIL, Toast.LENGTH_LONG).show();
}
});
array[0] = EMailSender.SendEmail();
}
}).start();
emailSuccessfullySent = array[0];
但我觉得这很奇怪。这是从Thread中设置值的普遍接受的方法,还是有更好的方法来做到这一点?
答案 0 :(得分:3)
它需要更多的开销,但在Android中解决此问题的最佳方法是使用Handler。 Handler
是一种结构,可用于从多个线程接收消息并在Handler
定义的线程上执行代码。通过覆盖handleMessage(Message msg)
方法并定义一些常量,您可以从任何线程发送消息,并在UI线程中处理它们。
代码:
public boolean variable = false;
private class MyHandler extends Handler {
public static final int MESSAGE_TOAST = 1;
public static final int THREAD_RETURN = 2;
public void handleMessage(Message msg){
if(msg.what == MESSAGE_TOAST){
Toast.makeText(msg.getData().getString("toast"), Toast.LENGTH_LONG).show();
} else if(msg.what == THREAD_RETURN){
variable = msg.getData().getBoolean("returnValue");
}
}
}
public MyHandler handler = new MyHandler();
这会使你的主题看起来像这样:
// Handle Automatic E-Mail Sending in a new Thread
new Thread(new Runnable() {
@Override
public void run() {
Bundle bundle = new Bundle();
bundle.setString("toast","I want to display this message");
Message msg = handler.obtainMessage(MyHandler.MESSAGE_TOAST);
msg.setData(bundle);
msg.sendToTarget();
bundle.setBoolean("returnValue", EMailSender.SendEmail());
msg = handler.obtainMessage(MyHandler.THREAD_RETURN);
msg.setData(bundle);
msg.sendToTarget();
}
}).start();
当你开始使用Handler
时,这有点令人困惑,但一旦你了解它们,它们就会变得简单而且非常强大。
答案 1 :(得分:0)
在synchronized
内设置非Thread
变量的值没有什么特别之处。由于您的boolean
被宣布为Thread
的“范围之外”,因此您所做的是完全可以接受的方式。这里的要点是boolean
的范围。但是,您不需要使用数组。 final
限定符仅仅是因为如果不是final
,则无法访问在内部类范围之外声明的变量。