方法跳过异步工作的同步操作

时间:2019-02-23 20:32:16

标签: android retrofit2

使用翻新检查数据库中的值以进行登录操作。我不想在不进行检查的情况下前进,因此希望同步发生。

我使用的是execute方法而不是入队,但仍然异步获取结果。我知道如果我都在同一个类中执行所有操作,则可能会起作用,但是我试图将它们分开保存,以防止将来的其他调用重复执行代码。请告诉我我做错了什么或如何解决这个问题。谢谢。

当我单击提交按钮时,将发生以下方法。此方法在我的活动中。 请注意,此方法中的所有内容均有效。问题是在startService之后,它不等待从我的休息服务中获取信息,而是直接跳转到Toast。之后,它继续执行到那时就没用的执行方法。

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

这是我的服务,在调用Toast之后进入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
        }
    }
}

0 个答案:

没有答案