Метод пропускает синхронную операцию, работающую асинхронно - PullRequest
0 голосов
/ 23 февраля 2019

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

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

Следующий метод происходит, когда я нажимаю кнопку отправки.Этот метод в моей деятельности.Обратите внимание, что все в этом методе работает.Проблема в том, что после startService он не ждет, чтобы получить информацию от моей службы отдыха, а вместо этого сразу переходит к тосту.После этого он продолжает выполнять метод execute, который к тому времени бесполезен.

    private void sendLoginRequest(User user){
        String token = verificationHelper.createToken(properties.API_KEY, user, 60000);
        Retrofit retrofit = retrofitHelper.getRetrofit(properties.BASE_URL);
        UserRepository userRepository = retrofit.create(UserRepository.class);
        Call<User> call = userRepository.login(token);
        if(call != null){
            syncService = new SyncService(call);
            Intent i = new Intent(this, SyncService.class);
            startService(i);
            if(verificationHelper.isValidLogin()){
                goToMainActivity();
            }
        }
        Toast.makeText(this, "Invalid Login", Toast.LENGTH_SHORT).show();
    }   

Это мой сервис, который входит в метод onHandleIntent после вызова Toast.(Ожидая, что это будет вызвано первым и проверено прежде, чем когда-либо попадет на тост).

public class SyncService extends IntentService {

    private VerificationHelper verificationHelper = new VerificationHelper();
    private PropertiesUtil properties = new PropertiesUtil();
    private RetrofitHelper retrofitHelper = new RetrofitHelper(verificationHelper, properties);

    private static Call<User> staticCall;

    public SyncService(Call<User> call) {
        super("SyncService");
        staticCall = call;
    }

    public SyncService(){
        super("SyncService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        retrofitHelper.performCallBackSync(staticCall);
    }
}

Это закончено в моем RetrofitHelper для справки.

public class RetrofitHelper {
    private VerificationHelper verificationHelper;
    private PropertiesUtil properties;

    public RetrofitHelper(VerificationHelper verificationHelper, PropertiesUtil properties) {
        this.verificationHelper = verificationHelper;
        this.properties = properties;
    }
    public void performCallBackSync(Call<User> call){
        try {
            // some logic that handles and verifies token values. 
            verificationHelper.setValidLogin(true);
        } catch (IOException e) {
            //some error handling
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...