2017-07-26 12 views
0

私は別のバックグラウンドメソッドの値から戻る必要があるメソッドを持っています。問題は、バックグラウンドメソッドがデータを返す前に常に行リターンが実行されることです。戻り値の前にメソッドをリスナーから待機させる方法はありますか?

ライン8は、常にライン5より前に実行してください。 このケースを処理するにはどうすればよいですか?

public String methodAbc(){ 
     int result = 0; 
     doSomeWorkWithCallBack(new ResultListener() { 
      @Override 
      public void onFinish(int data)){ 
       result = data; //line 5 
      } 
     } 
     return result; // line 8 
    } 
+0

これは、いくつかの非同期のバックグラウンドタスクが作業を行ってまで、あなたのメインスレッドを停止するための最良のアプローチではありません。 'AsynTask'や' Handler'のような他のより良いオプションを探すべきです。 –

答えて

0

これがスレッド化されていない限り、この問題は発生しません。これがスレッド化されている場合は、カスタムAsyncTaskでこれをラップするのが最善です。

class myAsyncTask extends AsyncTask<Void, Void, Result> { 
    @Override 
    protected Result doInBackground(Void... params) { 
     Result result = new Result(); 
     // do some work 
     // don't do anything in here that works on the UI :: this is a asynchronous call 
     return result; 
    } 
    @Override 
    protected void onPostExecute(Result result) { 
     super.onPostExecute(result); 
     // do something with result 
    } 
} 
2

コールバックを使用しているため、methodAbc()は結果を返さないでください。あなたが行うことができます

public void methodExpectingResult(){ 
    int result = methodAbc(); 
    // do something with the result 
} 

を::

ので、代わりのやっ

public void methodExpectingResult(){ 
    methodAbc(); 
    // do nothing 
} 

public void methodAbc() { 
    int result = 0; 
    doSomeWorkWithCallBack(new ResultListener() { 
     @Override 
     public void onFinish(int data) { 
      onMethodAbcReturn(data); 
     } 
    }); 

} 

private void onMethodAbcReturn(int data) { 
    // do something with the result 
} 
関連する問題