簡體   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