我遇到这个问题,当异步任务执行后给定状态更新时,我必须进行导航。我这样做是这样的:
At ViewModel.kt
fun executeRandomTask() {
viewModelScope.launch {
runAsyncTask()
state = Success
}
}
At Composable.kt
LaunchedEffect(viewModel.state) {
if(viewModel.state is Success) {
navController.navigate("nextScreen")
}
}
Run Code Online (Sandbox Code Playgroud)
然后在下一个屏幕中,我单击后退导航按钮 (onBackPressed),会发生什么情况,效果再次启动。所以我又回到了“nextScreen”。
当我执行下一个解决方法时:
DisposableEffect(viewModel.state) {
if(viewModel.state is Success) {
navController.navigate("nextScreen")
}
onDispose {
viewModel.state = null
}
}
Run Code Online (Sandbox Code Playgroud)
像这样,视图模型状态被清除,它也证明正在发生的事情是导航控制器破坏了前一个屏幕(不确定这是否是预期的行为)。
我不确定我应该做什么来避免这种情况,因为这是一种非常常见的情况,并且在达到某个状态后必须清除状态看起来很脏。
android side-effects android-jetpack-compose jetpack-compose-navigation
我在我的android应用程序中使用Realm.我通过CompletionEvent从谷歌驱动器收到通知,所以我需要在服务中修改我的领域数据库.
我得到的例外是:
java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
Run Code Online (Sandbox Code Playgroud)
我已经在我的Application类中设置了我的默认配置:
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(getApplicationContext())
.deleteRealmIfMigrationNeeded()
.build();
Realm.setDefaultConfiguration(realmConfiguration);
Run Code Online (Sandbox Code Playgroud)
在我的服务的onCreate中,我得到了我的Realm实例:
mRealm = Realm.getDefaultInstance();
Run Code Online (Sandbox Code Playgroud)
然后我在服务中使用这个领域实例:
mRealm.executeTransaction(realm -> {
DocumentFileRealm documentFileRealm = realm.where(DocumentFileRealm.class)
.equalTo("id", documentFileId)
.findFirst();
documentFileRealm.setDriveId(driveId);
});
Run Code Online (Sandbox Code Playgroud)
但是当执行最后一个时,应用程序会启动IllegalStateException.我不知道为什么.我不确定它是否与我在Android清单中声明服务的方式有关,所以我把它留在这里:
<service android:name=".package.UploadCompletionService" android:exported="true">
<intent-filter>
<action android:name="com.google.android.gms.drive.events.HANDLE_EVENT"/>
</intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)
可以从后台服务中调用Realm吗?我使用它的方式有什么问题?
提前致谢.