小编No *_*eto的帖子

Compose 副作用 + Jetpack 导航 + onBackPressed = 卡住导航

我遇到这个问题,当异步任务执行后给定状态更新时,我必须进行导航。我这样做是这样的:

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

7
推荐指数
1
解决办法
2116
查看次数

Android背景服务中的领域

我在我的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吗?我使用它的方式有什么问题?

提前致谢.

android realm

6
推荐指数
1
解决办法
3532
查看次数