int方法返回错误值

时间:2019-11-12 13:06:18

标签: java android

我确定我的语法在某处是错误的... 我有以下方法:

private int getVersionStatus(){
        // Creates instance of the manager.
        AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(this);

        // Returns an intent object that you use to check for an update.
        Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();


        // Checks that the platform will allow the specified type of update.
        appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
            versionCode=appUpdateInfo.updateAvailability();
            Log.d("ADebugTag", "Value: " + String.valueOf(appUpdateInfo.updateAvailability()));
            Log.d("ADebugTag", "Value123: " + String.valueOf(versionCode));     
        });

        return versionCode;        
    }

当我从onCreate()调用方法时,两个日志都打印正确的值,但是返回的int(versionCode)不同...这是怎么回事?

2 个答案:

答案 0 :(得分:3)

这是因为在调用versionCode之前返回了addOnSuccessListener。设置了侦听器,getVersionCode()返回,并最终调用了addOnSuccessListener的lambda。

使用您现在使用的api,不可能返回值。您可以做的是将回调作为参数传递给getVersionCode()

一个例子:

    interface Callback {
        void setVersion(int version);
    }

    private void getVersionStatus(Callback callback){
        // Creates instance of the manager.
        AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(this);

        // Returns an intent object that you use to check for an update.
        Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();


        // Checks that the platform will allow the specified type of update.
        appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
            callback.setVersion(appUpdateInfo.updateAvailability());
        });
    }

    private void yourOtherFuncton() {
        getVersionStatus(version -> {
            Log.d("ADebugTag", "Value: " + String.valueOf(version));
        });
    }

基本上,它们与PPartisan的答案相同,具有您自己定义的界面。

答案 1 :(得分:2)

根据您的代码,我假设这是检索您的版本代码的部分:

appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
    versionCode=appUpdateInfo.updateAvailability();
    //...
});

在这种情况下,您将以同步方式处理异步代码。无需添加对另一个库(即RxJava)的依赖关系,您可以通过更改方法签名以使用回调而不是返回值来解决此问题:

private void versionCode(IntConsumer consumer) {
    //...
    appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
        consumer.accept(appUpdateInfo.updateAvailability());
    });
}

使用方式:

versionCode(code -> Log.d("TAG", "Version code is: " + code));