我确定我的语法在某处是错误的... 我有以下方法:
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)不同...这是怎么回事?
答案 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));