2016-10-12 2 views
1

나는 안드로이드 초보자이며 http 호출을 위해 Retrofit 2.0을 사용하고 있습니다. 다른 활동에서 같은 호출을 사용하기 때문에, 나는 비 활동 클래스에서 함수를 만들었습니다. 여기 비 활동 클래스의 개장 전화

public class ServerRequests { 


private static ServerRequests serverRequests = new ServerRequests(); 

public static ServerRequests getInstance(){ 

    return serverRequests; 
    } 

public LoginResponse ClientLogin(final LoginRequest request, Context context){ 

    final ProgressDialog dialog = DialogueUtils.getInstance().showProgressDialog(context); 
    dialog.setMessage("Loading..."); 
    dialog.show(); 

    RestApi mApi = RetrofitProvider.getInstance().getRestApi(); 

    Call<UserToken> call = mApi.clientLogin(request); 

    // Stores Login response 
    final LoginResponse loginResponse = new LoginResponse(); 

    call.enqueue(new Callback<UserToken>() { 
     @Override 
     public void onResponse(Call<UserToken> call, Response<UserToken> response) { 
      dialog.dismiss(); 
      if (response.isSuccessful()){ 
       loginResponse.setMloginstatus(true); 
       loginResponse.setStatusCode(response.code()); 
       loginResponse.setUserToken(response.body()); 

       return; 
      } 

      // response isn't successful 
      loginResponse.setMloginstatus(false); 
      loginResponse.setStatusCode(response.code()); 
      loginResponse.setMessage(response.message()); 
      loginResponse.setUserToken(null); 
     } 

     @Override 
     public void onFailure(Call<UserToken> call, Throwable t) { 

      dialog.dismiss(); 
      loginResponse.setMloginstatus(false); 
      loginResponse.setUserToken(null); 
      loginResponse.setMessage(t.getMessage()); 
      loginResponse.setStatusCode(FAILURE_ERROR); 
     } 
    }); 

    return loginResponse; 
} 
} 
내가 활동 클래스에서 위의 함수를 호출 할 것이다

,

코드입니다 여기

비 활동 클래스 코드 내 개조 통화, 여기

LoginRequest request = new LoginRequest(); 
request.setPassword(PASSWORD); 
request.setEmail(USER_NAME); 

// Calling Login function 

LoginResponse response = ServerRequests.getInstance().ClientLogin(request, this); 

, 받기 전에 응답 클래스에서 다음 코드 행 세트가 실행 중입니다. 따라서 Activity 클래스는 함수가 호출 순서로 되돌아 갈 때까지 기다리지 않습니다.

누구든지이 작업을 수행하는 더 좋은 방법이 무엇인지 제안 해 주실 수 있습니까?

onResponse 또는 onFailure 중 하나를 호출은 백그라운드에서 수행하고, 즉시 호출이 완료로, 두 개의 콜백 중 하나라고 .. 당신

답변

2

콜백을 처리하기 위해 인터페이스를 사용할 수 있다고 생각합니다.

1 단계 : 인터페이스를 정의

public interface LoginListener{ 
public void success(Response<UserToken> response); 
public void failed(String message); 
} 

2 단계 : 사용 당신이 개조를 사용하는 방법에이 인터페이스.

public LoginResponse ClientLogin(final LoginRequest request, Context context, LoginListener listener){ 

    final ProgressDialog dialog = DialogueUtils.getInstance().showProgressDialog(context); 
    dialog.setMessage("Loading..."); 
    dialog.show(); 

    RestApi mApi = RetrofitProvider.getInstance().getRestApi(); 

    Call<UserToken> call = mApi.clientLogin(request); 

    // Stores Login response 
    final LoginResponse loginResponse = new LoginResponse(); 

    call.enqueue(new Callback<UserToken>() { 
     @Override 
     public void onResponse(Call<UserToken> call, Response<UserToken> response) { 
      dialog.dismiss(); 

      listener.success(response); 
     } 

     @Override 
     public void onFailure(Call<UserToken> call, Throwable t) { 

      dialog.dismiss(); 
      listener.failed("message error"); 
     } 
    }); 

    return loginResponse; 
} 

나는이 방법이 당신을 도울 수 있기를 바랍니다.

0

call.enqueue()가 비동기 감사드립니다.

call.execute()은 동기식이므로 호출이 완료 될 때까지 실행을 차단하지만이 경우 수동으로 스레딩을 처리해야합니다 (안드로이드에서 UI 스레드를 차단할 수 없음을 기억하십시오).

나는 enqueue을 권장합니다.

2

개조 호출을 비동기식으로 수행 중이므로 메서드에서 결과를 반환 할 수 없습니다. 대신 콜백을 사용하십시오.

public interface GenericCallback<T> { 

void success(T result); 
void failure(... whatever you need); 
} 

public void ClientLogin(final LoginRequest request, Context context, final GenericCallback<LoginResponse> callback){ 

    final ProgressDialog dialog = DialogueUtils.getInstance().showProgressDialog(context); 
    dialog.setMessage("Loading..."); 
    dialog.show(); 

    RestApi mApi = RetrofitProvider.getInstance().getRestApi(); 

    Call<UserToken> call = mApi.clientLogin(request); 

    // Stores Login response 
    final LoginResponse loginResponse = new LoginResponse(); 

    call.enqueue(new Callback<UserToken>() { 
     @Override 
     public void onResponse(Call<UserToken> call, Response<UserToken> response) { 
      dialog.dismiss(); 
      if (response.isSuccessful()){ 
       loginResponse.setMloginstatus(true); 
       loginResponse.setStatusCode(response.code()); 
       loginResponse.setUserToken(response.body()); 

       callback.success(loginResponse); 
       return; 
      } 

      // response isn't successful 
      loginResponse.setMloginstatus(false); 
      loginResponse.setStatusCode(response.code()); 
      loginResponse.setMessage(response.message()); 
      loginResponse.setUserToken(null); 

      callback.failure(...); 
     } 

     @Override 
     public void onFailure(Call<UserToken> call, Throwable t) { 

      dialog.dismiss(); 
      loginResponse.setMloginstatus(false); 
      loginResponse.setUserToken(null); 
      loginResponse.setMessage(t.getMessage()); 
      loginResponse.setStatusCode(FAILURE_ERROR); 
      callback.failure(...); 
     } 
    }); 
} 
관련 문제