2016-05-10 26 views
1

我有這兩種方法聲明:而一個的AsyncTask正在執行使用一個接口如何從方法中的內部接口返回值?

private Result mResult; 

private void setResult(Result result){ 
    this.mResult = result; 
} 

private Result getResult(){ 
    new Executor(new OnResultListener() { 
     @Override 
     public void onResult(Result result) { 
      setResult(result); 
     } 
    }).execute(); 
    return mResult; 
} 

林。我的問題是,我想將方法​​的結果對象作爲對象返回給getResult()方法。

如上所示,我試圖通過setter來設置它,但似乎這不起作用。

我該如何成功? 在此先感謝!

+0

你根本無法做到這一點。您可以使用Handler/LocalBroadcast/EventBus以異步方式傳遞消息。另一種方法是創建一個擴展AsyncTask的類,然後在完成過程時調用回調方法修改修改或新數據 –

+0

您是否嘗試將mResult標識符更改爲'static'?只需在'onResult'內調用它即可:'mResult = result;'?如果這不起作用,那麼使用接口怎麼樣? –

+0

您有一個異步回調,並且您想通過阻塞獲取器來獲取其結果。 我認爲你應該檢查你的代碼邏輯。你真的想實現什麼? 我認爲你的問題可能只是通過實現一個接口來解決 – FrenchFalcon

回答

1

您可以提供一個OnResultListener的實例作爲您的AsyncTask的構造函數的一部分,調用者必須實現該實例。例如。

private Result mResult; 
private OnResultListener mListener; 
private void setResult(Result result, OnResultListener listener){ 
    this.mResult = result; 
    mListener = listener; 
} 


private Result getResult(){ 
    new Executor(new OnResultListener() { 
     @Override 
     public void onResult(Result result) { 
      if (mListener != null) { 
       mListener.onResult(result); 
      } 
      setResult(result); 
     } 
    }).execute(); 
    return mResult; 
} 

,或者你可以直接提供給mListenernew Executor

+0

我不明白你的方式..你使用一個參數調用setResult方法,但是你聲明瞭兩個.. – Kanellis

+0

你有第一個參數。它的目的無法迴避。 – Blackbelt

2

你有兩個選擇這裏。壞的是等到新線程結束。讓我們不要那樣做)。更好的辦法是使用一個回調:

public static interface OnResultCallback { 
    void onResult(Result result); 
} 

private void getResult(final OnResultCallback callback){ 
    new Executor(new OnResultListener() { 
     @Override 
     public void onResult(Result result) { 
      setResult(result); 
      callback.onResult(result); 
     } 
    }).execute(); 
} 
+0

感謝您的回答!我明白,但我怎麼才能等到線程結束? – Kanellis

+0

以及如何從Callback界面獲取結果? – Kanellis

+0

@Kanellis attache請完整的'異步任務'的源代碼。我不完全確定你如何與'executor'一起使用它 –

0
public class CustomOnResultListener extends OnResultListener{ 
Callback callback ; 
public CustomOnResultListener(Callback callback){} 
    this.callback =callback; // use this callback to send result 
} 
public interface Callback{public void onCallback(Result result);};