从Runnable返回值

jos*_*ior 2 java multithreading android

我有几天试图解决这个问题,但我不能解决,对此的解决方法是转到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];
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您的阅读。欢呼

pd)我不能使用Runnable .join()或Callable <>

Mar*_*los 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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

考虑以下接口实现:

public interface Listener<T> {
    void on(T arg);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

好吧,这是一个示例,在这种情况下,两个代码都将在MainThread中运行,该示例不涉及多线程,而是有关如何监听您启动的事件的信息。

但是,如果在这种情况下完成,则该解决方案适用于多线程。