繁体   English   中英

从Runnable返回值

[英]Return value from Runnable

我有几天试图解决这个,但我不能,解决这个问题的方法是去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 <>

当您将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尚未运行。

您可以通知自己关于结论的方式是创建一个Interface侦听器,您可以在Runnable结束时通知它。

考虑以下接口实现:

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

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

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中运行,这个例子不包括多线程,但是关于如何监听你开始的事件。

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

您可以使用回调:

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});
        }
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM