[英]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.