2016-07-10 18 views
0

私は、Retrofit 2を使ってアプリケーションでRESTを実装しています。私のコールバックの1つは非同期です。 onResponse()メソッドから渡すデータを取得する必要がありますが、このメソッドは最後に実行されます(戻り値の後、スレッドが他の処理を行ったとき)。あなたは私の非同期コールバックを見つけることができます私のコードの一部ではあります:Retrofitで非同期コールバックの最終結果を得るには?

ここ
public class JSONManager { 

    //... 

    public Result insertUser(final Context context, final String login, final String password, final String salt, final String email) { 
      IUserApi userAPI = retrofit.create(IUserApi.class); 

      Call<User> user = userAPI.insertUser(login, password, salt, email); 
      user.enqueue(new Callback<User>() { 

       @Override 
       public void onResponse(Call<User> call, Response<User> response) { 
        try { 
         if (response.isSuccessful()) { 
          int mysqlId = response.body().mysqlId; 
          int temp = response.code(); 
          if (mysqlId > 0) { 
           result.setResponseCode(1); 
           if (sqLiteManager.addUser(login, password, salt, email, mysqlId)) { 
            result.setResponseCode(4); 
            result.setResult(true); 
           } else { 
            result.setResponseCode(5); 
            result.setResult(false); 
           } 
          } else { 
           result.setResponseCode(2); 
           result.setResult(false); 
          } 
         } else { 
          result.setResponseCode(3); 
          result.setResult(false); 
         } 
        } catch (Exception e) { 
         result.setResult(false); 
         result.setResponseCode(3); 
         e.printStackTrace(); 
        } 
       } 

       @Override 
       public void onFailure(Call<User> call, Throwable t) { 
        result.setResponseCode(2); 
        result.setResult(false); 
       } 
      }); 

     return result; 
    } 

    //... 
} 

私は結果を得る試みるが、残念ながら私は、予想される結果を受信しませんuser.enqueue()メソッドが後に実行され、私は前に書いたか、ので、 onClickRegistrationButton()メソッドを実行しています(遅すぎます)。

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener { 

    //... 

    private void onClickRegistrationButton() { 

      //... 

      JSONManager jsonManager = new JSONManager(); 
      Result result = jsonManager.insertUser(getApplicationContext(), login, encryptedPassword, salt, email); 

      //... 
    } 
} 

これをどのように修正できますか?代わりにあなたのinsertUser方法で結果オブジェクトを返すようにしようと、あなたはonResponseonFailure両方のパラメータとしてその結果を渡す関数を呼び出す試すことができます

+0

「結果」とは何ですか?あなたはその変数をどこで宣言していますか? –

+0

私はそれを忘れてしまった。それは私のタイプのオブジェクトです。 – joamor

答えて

0

callNewFunction(Result result); 

ような何か:

public class JSONManager { 

    //... 

    public void insertUser(final Context context, final String login, final String password, final String salt, final String email) { 
     IUserApi userAPI = retrofit.create(IUserApi.class); 

     Call<User> user = userAPI.insertUser(login, password, salt, email); 
     user.enqueue(new Callback<User>() { 

      @Override 
      public void onResponse(Call<User> call, Response<User> response) { 
       try { 
        if (response.isSuccessful()) { 
         int mysqlId = response.body().mysqlId; 
         int temp = response.code(); 
         if (mysqlId > 0) { 
          result.setResponseCode(1); 
          if (sqLiteManager.addUser(login, password, salt, email, mysqlId)) { 
           result.setResponseCode(4); 
           result.setResult(true); 
          } else { 
           result.setResponseCode(5); 
           result.setResult(false); 
          } 
         } else { 
          result.setResponseCode(2); 
          result.setResult(false); 
         } 
        } else { 
         result.setResponseCode(3); 
         result.setResult(false); 
        } 
       } catch (Exception e) { 
        result.setResult(false); 
        result.setResponseCode(3); 
        e.printStackTrace(); 
       } 

       callNewFunction(result); 
      } 

      @Override 
      public void onFailure(Call<User> call, Throwable t) { 
       result.setResponseCode(2); 
       result.setResult(false); 

       callNewFunction(result); 
      } 
     }); 
    } 

    private void callNewFunction(Result result){ 
     Log.d(TAG, "callNewFunction: " + result); 
    } 

    //... 
} 
+1

ご意見ありがとうございます。私はこのようなことをしましたが、 'user.enqueue()'が実行されるときに呼び出されるので、私が期待する値ではなく、デフォルトの 'result'値を返します。 – joamor

関連する問題