从Runnable返回值

时间:2015-09-24 21:43:36

标签: java android multithreading

我有几天试图解决这个问题,但我不能解决这个问题,解决方法是转到StackOverflow:D。发现我正在使用libgdx(用于制作游戏的库)以及在Android中查询代码是通过Handler类,运行Runnable而我真的不知道它是如何工作的。

基本上我想要的是从Runnable中检索一个值。使用带有回调的Handler类

我必须说我不太了解多线程编程,我在Handler类中看到了几种方法,但我无法理解它是如何工作的(消息传递,回调等)

public class ActionResolverAndroid implements ActionResolver {
    Handler handler;
    Context context;

public ActionResolverAndroid(Context context) {
    handler = new Handler();
    this.context = context;
}

public boolean checkAndroidData(){
    final boolean[] result = {false};
    handler.post(new Runnable() {
            @Override
            public void run() {
                // Android code here
                // I need know the value of this variable
                result[0] = true;
            }
    });
    return result[0];
}

非常感谢阅读。 欢呼

pd)我无法使用Runnable .join()或Callable<>

2 个答案:

答案 0 :(得分:5)

当您将Runnable发布到Handler时,该代码将在MainThread(您可以触摸您的视图的那个)中运行。

做的:

public boolean checkAndroidData(){
    final boolean[] result = {false};
    handler.post(new Runnable() {
            @Override
            public void run() {
                // Android code here
                // I need know the value of this variable
                result[0] = true;
            }
    });
    return result[0];
}

将使结果[0]始终为false,因为Runnable尚未运行。

您可以通知自己有关结论的方法是创建一个可以在Runnable结束时通知的接口侦听器。

考虑以下接口实现:

public interface Listener<T> {
    void on(T arg);
}

使用侦听器将等待侦听器中的响应而不是方法的返回值,因此上面的方法将是:

public void checkAndroidData(Listener<Boolean> onCompleteListener){
    handler.post(new Runnable() {
            @Override
            public void run() {
                onCompleteListener.on(true);
            }
    });
}

要调用,您将传递一个实例并等待响应,例如:

void onCreate(Bundle s){
    super.onCreate(s);
    checkAndroidData(new Listener<Boolean>(){
        public void on(Boolean result){
                Toast.makeText(result, Toast.LENGHT_LONG).show();
        }
    });
}

嗯,这是一个例子,在这种情况下,两个代码都将在MainThread中运行,这个例子不包括多线程,但是关于如何监听你开始的事件。

但是,如果在该上下文中完成,该解决方案适用于多线程。

答案 1 :(得分:3)

您可以使用回调:

public interface RunnableListener
{
    void onResult(boolean[] result);
}

// a field in your class 
private RunnableListener runnableListener;

private void someMethod()
{
    new Handler().post(new Runnable()
    {
        @Override public void run()
        {
            runnableListener.onResult(new boolean[]{true});
        }
    });
}