java - 从线程外部、线程运行内部设置 boolean 值

标签 java android multithreading runnable final

我在线程之外有一个 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 中解决此问题的最佳方法是使用 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 时,会有点困惑,但是一旦您了解它们,它们就会变得简单且非常强大。

关于java - 从线程外部、线程运行内部设置 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24139617/

相关文章:

java - 制作MySQL方法

java - Wicket:需要实现带有选项卡错误指示器的 AjaxTabbedPanel

java - 了解可嵌入的EJBContainer

android - DialogFragment 上的 commitAllowingStateLoss

c++ - Happens-Before 关系 - 在 C++ 中谈论并发的原子对象是什么?

c++ - 在 librdkafka 中,dr_cb 在 produce() 线程或 poll() 线程上执行

java - Jboss As 5 和 activemq

android - Activity 在 requestCode 中返回 "0"

android - 如何将文件写入外部存储(sdcard)

java - 如何使用 JPA 和 Hibernate 的多个处理线程来持久化实体