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