2016-07-10 7 views
0

Ich verwende Retrofit 2 zur Implementierung REST in meiner App. Einer meiner Rückrufe ist asynchron. Ich muss Daten von onResponse() Methode erhalten, um weiterzugeben, aber diese Methode wird am Ende ausgeführt (nach Rückgabeergebnis, wenn ein Thread andere Dinge getan hat). Es ist Teil meines Code ist, wo Sie meinen async Rückruf finden:Wie bekomme ich das Endergebnis vom asynchronen Callback in 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; 
    } 

    //... 
} 

Hier versuche ich das Ergebnis erhalten, aber leider bekomme ich nicht erwartetes Ergebnis, weil, wie ich schon schrieb, wird die user.enqueue() Methode ausgeführt nach Ausführen onClickRegistrationButton() Methode (also zu spät).

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener { 

    //... 

    private void onClickRegistrationButton() { 

      //... 

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

      //... 
    } 
} 

Haben Sie eine Idee, wie kann ich das beheben?

+0

Was ist "Ergebnis"? Wo deklarieren Sie diese Variable? –

+0

Ich habe es vergessen. Es ist ein Objekt meines eigenen Typs. – joamor

Antwort

0

Anstatt zu versuchen, ein Ergebnis Objekt in Ihrem insertUser Methode zurückzukehren, können Sie versuchen, eine Funktion aufrufen auf, dass sowohl Ergebnis als Parameter übergeben onResponse und onFailure:

callNewFunction(Result result); 

Etwas wie:

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

Vielen Dank für Ihr Feedback. Ich habe so etwas gemacht, aber es wird aufgerufen, wenn 'user.enqueue()' ausgeführt wird, also gibt es einen voreingestellten 'result'-Wert zurück, nicht einen Wert, den ich erwarte, und er ruft danach Ihre Methode auf. – joamor