2016-05-10 10 views
1

は、私はこれらの2つの方法が宣言している:メソッドの内部インターフェイスから値を返す方法は?

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; 
} 

イムを。私の問題は、のResultオブジェクトをメソッドのオブジェクトとしてgetResult()メソッドに返すことです。

上記のように、私はセッターを介して設定しようとしましたが、これは動作していないようです。

どうすればそれを成功させることができますか? ありがとうございます!

+0

:より良い方法は、コールバックを使用することです。 Handler/LocalBroadcast/EventBusを使用して、非同期の方法でメッセージを渡すことができます。別の方法は、AsyncTaskを拡張するクラスを作成し、プロセスが終了したときにコールバックメソッドを呼び出して変更または新しいデータを作成することです。 –

+0

mResult識別子を 'static'に変更しようとしましたか?そして、 'onResult'の中で' mResult = result; 'のように呼び出すだけです。それでも問題が解決しない場合は、インターフェイスの使用はどうですか? –

+0

非同期コールバックがあり、その結果をブロッキングゲッターで取得したいとします。 私はあなたのコードロジックを見直さなければならないと思います。あなたは本当に何を達成したいのですか? あなたの問題は単にインターフェイスを実装することで解決できると思います – FrenchFalcon

答えて

1

AsyncTaskのコンストラクタの一部としてOnResultListenerのインスタンスを提供することができます。これは、呼び出し元が実装する必要があります。例えば。

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; 
} 

またはあなたがここに2つのオプションがありmListener

+0

私はあなたの方法を静かに理解していません.1つのパラメータを使用してsetResultメソッドを呼び出しますが、2つを宣言しました。 – Kanellis

+0

最初のパラメータがあります。その目的は私を逃す。 – Blackbelt

2

new Executorにあなたが直接提供することができます。悪いのは、新しいスレッドが終了するまで待つことです。それをやりません)。あなたは、単にそれを行うことはできません

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

そして、コールバックインターフェイスからResultを取得する方法は? – Kanellis

+0

@Kanellisは 'async task'の完全なソースコードを書いています。私はあなたが '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);}; 
関連する問題