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 <>
当您将一个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中运行,该示例不涉及多线程,而是有关如何监听您启动的事件的信息。
但是,如果在这种情况下完成,则该解决方案适用于多线程。
| 归档时间: |
|
| 查看次数: |
9089 次 |
| 最近记录: |