在非活动类中进行改造调用

时间:2016-10-12 03:18:00

标签: android retrofit2

我是android的初学者,我正在使用Retrofit 2.0进行http调用。因为,我在不同的活动中使用相同的调用,所以我在非活动类中创建了函数。

这里我的改造调用了非活动类代码,

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;
}
}

我将在Activity类中调用上面的函数, 这是代码,

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

// Calling Login function

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

这里,在活动类中接收响应之前,下一组代码行正在执行。因此,Activity类不会等到函数返回到调用序列。

任何人都可以建议我做什么更好的方法。

谢谢

3 个答案:

答案 0 :(得分:2)

您无法从方法中返回结果,因为您正异步进行Retrofit调用。改为使用回调。

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(...);
        }
    });
}

答案 1 :(得分: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;
}

我希望,这种方式可以帮助你。

答案 2 :(得分:0)

call.enqueue()是异步的...调用是在后台完成的,然后,一旦调用完成,就会调用两个回调中的一个,onResponseonFailure

call.execute()是同步的,它会阻止执行直到调用结束,但在这种情况下你需要手动处理线程(请记住,在android中你不能阻止UI线程)。

我推荐enqueue