想知道是否有人可以提供帮助,我正在尝试了解使用两个线程访问 Kotlin 中的集合的正确方法。
下面的代码模拟了我在实时系统中遇到的问题。一个线程迭代集合,但另一个线程可以删除该数组中的元素。
我尝试将 @synchronized 添加到集合 getter 中,但这仍然给了我一个并发修改异常。
谁能告诉我这样做的正确方法是什么?
class ListTest() {
val myList = mutableListOf<String>()
@Synchronized
get() = field
init {
repeat(10000) {
myList.add("stuff: $it")
}
}
}
fun main() = runBlocking<Unit> {
val listTest = ListTest()
launch(Dispatchers.Default) {
delay(1L)
listTest.myList.remove("stuff: 54")
}
launch {
listTest.myList.forEach { println(it) }
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试做什么
我正在使用 Android 导航组件来处理我的应用程序中的导航。在此示例中,我有两个屏幕,屏幕 A 和屏幕 B。我希望用户能够单击屏幕 A 中的按钮并能够导航到屏幕 B;然后无法返回到上一屏幕(屏幕 A)。
问题
当用户从屏幕 A 导航到屏幕 B 时,操作栏上的后退按钮仍然允许用户返回上一屏幕,但是当单击底部栏中的后退按钮时,它会退出应用程序,因此这部分工作正常。
我需要做什么才能删除操作栏中的后退按钮?
到目前为止我读过的内容
我已遵循这三篇文章中的指导,但我认为他们可能忽略了ActionBar后退按钮:
我的代码
导航图 - nav_graph.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph"
app:startDestination="@id/screen_a">
<fragment
android:id="@+id/screen_a"
android:name="com.example.conditionalnavigation.AFragment"
android:label="screen A">
<action
android:id="@+id/action_AFragment_to_BFragment"
app:destination="@id/screen_b"
app:launchSingleTop="true"
app:popUpTo="@id/screen_a"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/screen_b"
android:name="com.example.conditionalnavigation.BFragment"
android:label="screen B" />
</navigation>
Run Code Online (Sandbox Code Playgroud)
MainActivity - 这充当我的单一活动导航主机。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { …Run Code Online (Sandbox Code Playgroud) android kotlin back-stack android-navigation android-jetpack-navigation