我有几天试图解决这个问题,但我不能解决这个问题,解决方法是转到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<>
答案 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});
}
});
}