Вернуть данные из дооснащения - PullRequest
0 голосов
/ 31 января 2020

Я создаю базовое c android приложение, которое выполняет простой вход в систему снова API. Мне нужно вернуть полученные данные, но метод модификации onResponse имеет тип возврата void. Мой код:

package com.example.deberesloginjava.data;

import android.util.Log;

import com.example.deberesloginjava.data.APIServices.Post;
import com.example.deberesloginjava.data.model.LoggedInUser;

import java.io.IOException;

import com.example.deberesloginjava.data.APIServices.APIService;
import com.example.deberesloginjava.data.APIServices.ApiUtils;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import static android.content.ContentValues.TAG;

/**
 * Class that handles authentication w/ login credentials and retrieves user information.
 */

public class LoginDataSource {

    private APIService mAPIService;

    public void getData(Callback<Result<LoggedInUser>> callback){
        apiClient.getData().enqueue(callback);
    }

    public Result<LoggedInUser> login(String username, String password) {

        try {

            mAPIService = ApiUtils.getAPIService();

           mAPIService.login(username, password, "password").enqueue(new Callback<Post>() {
                @Override
                public void onResponse(Call<Post> call, Response<Post> response) {
                    if(response.isSuccessful()) {
                        LoggedInUser loggedInUser;
                        loggedInUser = new LoggedInUser(response.body().getUserName(),response.body().getUserName(), response.body().getAccess_token());
                        return new Result.Success<>(loggedInUser);
                    }
                }



                @Override
                public void onFailure(Call<Post> call, Throwable t) {
                    Log.e(TAG, "Unable to submit post to API.");
                }
            });

        } catch (Exception e) {
            return new Result.Error(new IOException("Error logging in", e));
        }
    }
}

Я нашел по крайней мере два вопроса, подобных этому, и оба имеют почти одинаковое решение с обратными вызовами, но я не могу повторить его в моем случае.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Вы должны добавить пользовательский обратный вызов для обработки этого случая. вы не можете ничего вернуть внутри onResponse () и ononFailure ()

public interface CustomCallback {

    void onSucess(Result<LoggedInUser> value);
    void onFailure();
}

Обновите ваш метод следующим образом:

public void login(String username, String password,CustomCallback customCallback) {

        try {

            mAPIService = ApiUtils.getAPIService();

           mAPIService.login(username, password, "password").enqueue(new Callback<Post>() {
                @Override
                public void onResponse(Call<Post> call, Response<Post> response) {
                    if(response.isSuccessful()) {
                        LoggedInUser loggedInUser;
                        loggedInUser = new LoggedInUser(response.body().getUserName(),response.body().getUserName(), response.body().getAccess_token());
                        customCallback.onSucess(new Result.Success<>(loggedInUser));
                    }
                }


                @Override
                public void onFailure(Call<Post> call, Throwable t) {
                    Log.e(TAG, "Unable to submit post to API.");
                    customCallback.onFailure();
                }
            });

        } catch (Exception e) {
            e.printStactTrace();
        }
    }

Вы должны вызвать свой API, как показано ниже:

login("user name","passwor",new CustomCallback(){
       @Override
       public void onSucess(Result<LoggedInUser> value){
      //do your success code here
     }
       @Override
       public void onFailure(){
      }

});
1 голос
/ 31 января 2020

На самом деле вы не можете вернуть значение, вместо этого вы можете попробовать создать метод для передачи / хранения данных в DTO и вызвать этот метод в вашем respose.IsSuccessful. Передайте объект ответа json методу для хранения необходимых материалов, таких как токен, имя пользователя n et c,.

. Вы можете попробовать сделать его похожим на

               if(response.isSuccessful()) {
                    // just a loader untill all operations are done
                    progressBar.SetVisibility(View.Visible);
                    //Make a toast here for successful login
                    LoggedInUser loggedInUser;
                    loggedInUser = new LoggedInUser(response.body().getUserName(),response.body().getUserName(), response.body().getAccess_token());
                    UserDTO(loggedInUser);//it will save the users login details.
                }
                else{
                    //Make a toast as per your responce error.code as Invalid Password or any other error
                }

В UserDTO () Вы можете создать сеанс входа в систему для пользователя для автоматического входа, когда пользователь использует приложение в следующий раз, ему не нужно повторно вводить идентификатор и пароль. После обработки Перейдите к своему желанию. Вид StartActivity()

Надеюсь, что это то, чего вы пытаетесь достичь.

...