在Thread-run内部从Thread外部设置布尔值

时间:2014-06-10 11:15:28

标签: java android multithreading runnable final

我在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中设置值的普遍接受的方法,还是有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:3)

它需要更多的开销,但在Android中解决此问题的最佳方法是使用HandlerHandler是一种结构,可用于从多个线程接收消息并在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,则无法访问在内部类范围之外声明的变量。