2017-06-15 3 views
1

Ich habe ein Problem mit meinem Code.onResponse Rückgabevariable oder throw Ausnahme Retrofit 2.0

Ich möchte Variable oder Ausnahme zurückgeben, aber ich verstehe die Methode in den verschiedenen Post in Stackoverflow nicht.

ich mit Retrofit bin neu wenn mir jemand eine Lösung erklären kann, ist es für ein Projekt

ich diese Instanz Methode in der Klasse Benutzer verwenden, es ist mein Modell in der mvc

Ich möchte boolean Variable zurück, wenn meine Benutzer erstellen und Ausnahme ist, wenn die Verbindung nach unten ist

public void connectPassword(String nameuser, String password) { 
    Api api = new Api(); 
    Call<Connection> call = api.getService().connectPassWord(nameuser, password); 
    call.enqueue(new Callback<Connection>() { 
     public void onResponse(Call<Connection> call, Response<Connection> response) { 
      System.out.println(response.body().getToken()); 
      System.out.println("Connecter"); 
      User.this.token = response.body().getToken(); 
      //return boolean her 
     } 

     public void onFailure(Call<Connection> call, Throwable throwable) { 
      System.out.print(throwable.getMessage()); 
      // throw Exception her 
     } 
    }); 
} 

Meine Klasse ApiService

public interface ApiService { 

@FormUrlEncoded 
@POST("createuser.php") 
Call<Register> sendRegister(@Field("username") String username, @Field("password") String password, @Field("email") String email); 

@FormUrlEncoded 
@POST("login.php") 
Call<Connection> connectPassWord(@Field("username") String username, @Field("password") String password); 

@FormUrlEncoded 
@POST("login.php") 
Call<Connection> connectToken(@Field("username") String username, @Field("token") String password); 

}

Und meine Klasse Api

public class Api { 

private Retrofit retrofit; 
private ApiService service; 

public Api(){ 
    this.retrofit = new Retrofit.Builder().baseUrl("http://localhost/ProjetS2/").addConverterFactory(new NullOnEmptyConverterFactory()).addConverterFactory(GsonConverterFactory.create()).build(); 
    this.service = retrofit.create(ApiService.class); 
} 

public ApiService getService(){ 
    return this.service; 
} 

}

+0

Sie können Schnittstellen verwenden, haben Sie das versucht? – Ashwani

+0

Ich tat, obwohl sie auf Retrofit-Thread laufen, die in meinem Controller auf JavaFX nicht funktionieren kann :( –

Antwort

1

Sie es auf diese Weise

public void connectPassword(String nameuser, String password, MyInterface myInterface) { 
    Api api = new Api(); 
    Call<Connection> call = api.getService().connectPassWord(nameuser, password); 
    call.enqueue(new Callback<Connection>() { 
     public void onResponse(Call<Connection> call, Response<Connection> response) { 
      System.out.println(response.body().getToken()); 
      System.out.println("Connecter"); 
      User.this.token = response.body().getToken(); 
      myInterface.onSuccess(true); 
      //return boolean her 
     } 

     public void onFailure(Call<Connection> call, Throwable throwable) { 
      System.out.print(throwable.getMessage()); 
      myInterface.onException(throwable.getMessage()); 
      // throw Exception her 
     } 
    }); 
} 

MyInterface.class

public interface MyInterface{ 
public void onSuccess(boolean value); 
public void onException(String value); 
} 

Von Ihrer Telefon Klasse Angenommen Haupt

public class Main implements MyInterface{ 

@Override 
public void onSuccess(boolean value){ 
//TODO do your stuff with returned boolean from your call 
} 

@Override 
public void onException(String value){ 
//TODO you will receive the message here 
} 

//in your onCreate 
... 
//method call 
connectPassword("username","password",this); 

} 

Hoffnung, das hilft.

+0

Perfekt habe ich etwas ähnliches, und das funktioniert perfekt Grüße –

0

Ich fürchte, Sie können nicht einfach von Retrofit Callbacks zurückkehren. Sie sind asynchron und daher erhalten Sie Ihre Werte auch asynchron.

Was Sie jedoch tun können, ist den Wert mit Ihren eigenen Rückrufen zu verbreiten. Dies wird zu der sogenannten "Callback-Hölle" führen, aber es funktioniert und wenn Sie nicht zu sehr gestört werden, ist es in Ordnung.

So lassen Sie mich versuchen, Sie durch eine mögliche Lösung zu führen (es gibt mehrere Möglichkeiten, wie Sie dies tun können).

Sagen Sie bitte Ihren Rückruf wie so definiert haben:

public interface UserCallbacks { 
    void onUserCreatedSuccessfully(@NonNull User user); 

    void onError(@NonNull Throwable throwable); 
} 

Sehr einfache Schnittstelle, die zwei Methoden aussetzt, die Sie anrufen können. Der erste sagt dem Listener, dass der Benutzer erfolgreich erstellt wurde und der andere teilt dem Listener mit, dass ein Fehler aufgetreten ist.

Nun ändern Sie Ihre Methode, um so etwas wie diese:

public void connectPassword(String nameuser, String password, UserCallbacks callbacks) { 
    Api api = new Api(); 
    Call<Connection> call = api.getService().connectPassWord(nameuser, password); 
    call.enqueue(new Callback<Connection>() { 
    public void onResponse(Call<Connection> call, Response<Connection> response) { 
     callbacks.onUserCreatedSuccessfully(/*send the user here*/); 
    } 

    public void onFailure(Call<Connection> call, Throwable throwable) { 
     callbacks.onError(throwable); 
    } 
    }); 
} 

Der letzte Schritt ist das Objekt der Rückrufe zu übergeben. Sagen Sie Ihre Controller die Rückrufe Schnittstelle implementiert, können Sie es wie dies tun könnte:

public class UserController implements UserCallbacks { 
    // ... 
    public void onUserCreatedSuccessfully(@NonNull User user) { 
    // do whatever we need to do 
    } 

    public void onError(@NonNull Throwable throwable) { 
    // inspect the error and see what we have to change in the ui 
    } 

    public void connect(String username, String password) { 
    // Suppose you have your service created 
    service.connectPassword(username, password. this); 
    } 
} 

So stellen Sie sicher, dass Sie alle UI-Code in dem UI-Thread ausgeführt werden.Kann verwenden runOnUiThread