我在线程之外有一个 boolean 值。然后我使用一个方法,该方法需要一个返回 boolean 值的线程。如何使用返回的 boolean 值在线程外部设置 boolean 值?
代码:
// 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];
但我觉得这很奇怪。这是在线程内设置值的普遍接受的方法,还是有更好的方法来做到这一点?
最佳答案
这需要更多的开销,但在 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
时,会有点困惑,但是一旦您了解它们,它们就会变得简单且非常强大。
关于java - 从线程外部、线程运行内部设置 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24139617/