在使用 Android Room 时我应该考虑哪些例外情况。从我的研究中,我发现只有一种例外情况可能发生。
这也是当你有Single<T>一个返回类型并且你有一个空的回报时。除此之外,我找不到任何其他可能引发异常的情况。
当然,如果你有一些逻辑上不正确的实现,可能会有一些例外,比如
MigrationOnConflictStrategy插入时不执行allowMainThreadQueries()我做了一些研究并尝试了几乎所有可能的情况,主要是 RxJava 返回类型,我看到了上面提到的一个异常,就是这样。
这是我运行的测试
我想确保我对每个可能的场景都有实现,并且没有一些异常和意外崩溃。我在想SQLite可能会发生异常的情况,但我相信它已经包裹在 Room 中并且会处理。(没有把握)
你能给出可能发生的任何其他可能的例外吗?
我有一个像下面这样的通用方法
private fun <T> getSomething(): T {
return "something" as T
}
Run Code Online (Sandbox Code Playgroud)
如何使用变量T类型调用此方法?
val types = arrayListOf<Type>(String::class.java, Boolean::class.java)
types.forEach { type ->
val something = getSomething<type>() // Unresolved reference: type
}
Run Code Online (Sandbox Code Playgroud)
在运行时,我不知道什么是泛型类型T。我正在获取类型,types并且应该使用泛型getSomething方法传递它。
我想调用有几个表的数据库。示例模型是这样的
class User{
}
class Student{
}
Run Code Online (Sandbox Code Playgroud)
由于所有调用查询基本相同,因此我想拥有调用数据库和获取数据的通用方法。
private fun <T> getData(model: String): List<T>?{
return when(model){
"user" -> getUsers()
"student" -> getStudents()
else -> null
}
}
Run Code Online (Sandbox Code Playgroud)
所以当我调用上面的方法时。在我环路我想传递Type的任何User或Student。
val types = arrayListOf<Type>(User::class.java, Student::class.java) …Run Code Online (Sandbox Code Playgroud) 如何在新的导航组件中添加片段更改侦听器?
我有一个BottomNavigationView,我在官方示例之后使用了新的导航组件
我的 中有四个目的地BottomNavigationView,所有目的地都有导航图。
val navGraphIds = listOf(R.navigation.nav_home, R.navigation.nav_discover, R.navigation.nav_search, R.navigation.nav_my)
val controller = bottom_nav.setupWithNavController(
navGraphIds = navGraphIds,
fragmentManager = supportFragmentManager,
containerId = R.id.navHostContainer,
intent = intent
)
controller.observe(this, Observer { navController ->
setupActionBarWithNavController(navController)
})
Run Code Online (Sandbox Code Playgroud)
MainActivity当片段在 4 个导航图中的任何一个中发生更改时,我想在我的中有一个侦听器。
该controller间切换时,只有情感BottomNavigationView目的地。
我正在使用Room进行数据库管理,而在处理实时数据时该使用什么却感到困惑。现在,要管理我正在使用的实时数据,我对此Flowable非常满意。我感到困惑的是,我也可以使用LiveData它来执行相同的操作。
为了提供一些背景信息,这是我查询数据和更新视图的方式。
addDisposable(userDao().getUsersFlowable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(users -> userAdapter.setUsers(users)));
Run Code Online (Sandbox Code Playgroud)
userDao().getUsersLiveData()
.observe(this, users -> {
userAdapter.setUsers(users)
})
Run Code Online (Sandbox Code Playgroud)
我不太熟悉LiveData,但是就我的研究而言,它是一个观察者模式,它也知道生命周期,这意味着我将停止通知UI是否未处于活动状态。就是说,正如您在我的Flowable代码中看到的那样,我将其添加到其中CompositeDisposable,并将在我的onDestroy()方法中进行处理。因此,我看不出为什么我应该使用LiveData什么时候可以用进行管理RxJava,因为为了方便起见,该操作有很多运算符。
所以我应该何时使用,LiveData以及何时RxJava使用Room。反映给定方案的答案非常受赞赏,但也欢迎其他用例。
我遵循了何时在Android中使用RxJava以及何时从Android Architectural Components中使用LiveData?,但范围太广,我无法具体回答我的情况
observer-pattern rx-java rx-java2 android-room android-livedata
我ExitText在里面使用TextInputLayout并启用了``
app:passwordToggleEnabled="true"
Run Code Online (Sandbox Code Playgroud)
并得到Toggle如下视图
我想删除右侧的填充toggle,但不知何故无法做到。我已经把一切都设置好了0dp,但没有成功。
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:passwordToggleEnabled="true"
android:layout_margin="0dp"
android:padding="0dp">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="0dp"
android:layout_margin="0dp"
android:drawablePadding="0dp"/>
</com.google.android.material.textfield.TextInputLayout>
Run Code Online (Sandbox Code Playgroud)
有一些幼稚的解决方案,例如设置负边距,但由于我不知道填充的大小,我也无法这样做。有什么建议吗?
我有一个 lateinit var 作为
lateinit var someVariable: SomeVariable
Run Code Online (Sandbox Code Playgroud)
我初始化这个值someVariable = SomeVariable(),并在需要时使用它。
在某个时候,我想将所有内容都设置为默认值并希望“取消初始化” someVariable。我怎样才能做到这一点?
我不是在寻找将其类型更改为nullable对象并设置为空。我需要保持一种Non-Null类型。
我有一个类activity_player布局,exoplayer2.ui.PlayerView我在其中创建了它exo_player_control_view,以便它覆盖 ExoPlayer 中的默认控件。所以我想在新创建的自定义控件视图中使用数据绑定,但不知道该怎么做。有什么建议吗?
这实际上是一个悬而未决的问题,但尚未解决。那么是否有人有解决方法来使exo_player_control_view数据绑定变得友好?
我试图在导航组件中从导航DialogFragment到Fragment,但是结果很奇怪。
当我从导航DialogFragment到时Fragment,背景片段会更改为目标片段,并在其顶部显示当前对话框,而不仅仅是移动到目标片段。
这是导航图。
<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/home"
app:startDestination="@+id/titleScreen">
<fragment
android:id="@+id/titleScreen"
android:name="com.example.android.navigationadvancedsample.homescreen.Title"
android:label="@string/title_home"
tools:layout="@layout/fragment_title">
<action
android:id="@+id/action_title_to_about"
app:destination="@id/aboutScreen"/>
</fragment>
<dialog
android:id="@+id/aboutScreen"
android:name="com.example.android.navigationadvancedsample.homescreen.About"
android:label="@string/title_about"
tools:layout="@layout/fragment_about">
<action
android:id="@+id/action_aboutScreen_to_register"
app:destination="@id/register" />
</dialog>
<fragment
android:id="@+id/register"
android:name="com.example.android.navigationadvancedsample.formscreen.Register"
android:label="fragment_leaderboard"
tools:layout="@layout/fragment_leaderboard" />
</navigation>
Run Code Online (Sandbox Code Playgroud)
为什么我会出现这种现象或如何解决?
修复是指正常的对话框行为。我说,我有一个对话框d上的一个分段的顶部一个,并移动到一个片段乙从一个按钮d,屏幕应该显示乙。当我从B弹出时,它应该转到A之上的D的前一阶段。
android android-fragments android-dialogfragment android-navigation android-architecture-navigation
我有三个功能updateFieldFromCollection1(),insertFromColletion1ToCollection2()和deleteFromCollection1()现在。
这些调用并不相互依赖,但是当我想在completableFuture 中链接它们时,它们必须按照给定的顺序一个接一个地运行。
update-> insert -> delete
Run Code Online (Sandbox Code Playgroud)
调用不返回任何内容,因此我使用的是runAsync和thenRun的completableFuture方法。并相应地将它们链接起来。我正在迭代 msgIds,它是一个字符串列表。
msgIds.stream().forEach(msgId -> CompletableFuture.runAsync(() ->
{updateFieldFromCollection1()}).thenRun(() ->
{insertFromColletion1ToCollection2()}).thenRun(() ->
{deleteFromCollection1()}));
Run Code Online (Sandbox Code Playgroud)
上面的代码有效(更新-> 插入-> 删除已完成)但会抛出像duplicateKey 和bulkwrite 这样的异常。我确信问题出现是因为在前一个线程完成其任务之前另一个线程正在启动。我希望它们异步运行,但我想通过避免冲突来规范线程。
我不确定我需要在哪里调整代码。
很少有 Kotlin 扩展带有org.gradle.kotlin.dsl类似
android或publishing等。比如说, for publishing,扩展定义如下
fun org.gradle.api.Project.`publishing`(configure: org.gradle.api.publish.PublishingExtension.() -> Unit): Unit =
(this as org.gradle.api.plugins.ExtensionAware).extensions.configure("publishing", configure)
Run Code Online (Sandbox Code Playgroud)
这意味着在我的范围内build.gradle.kts我可以打电话
publishing {
// blablabla
}
Run Code Online (Sandbox Code Playgroud)
就我而言,我有一个单独的文件来处理定义为的发布random.gradle.kts,并且位于完全随机的目录中。
在这里,我想访问这个publishing扩展,但无法做到。
欢迎任何建议。
再举个例子android也是不可访问的。在我的build.gradle.kts我可以访问android,但在我的random.gradle.kts我无法做到这一点。
android扩展名定义如下
val org.gradle.api.Project.`android`: com.android.build.gradle.LibraryExtension get() =
(this as org.gradle.api.plugins.ExtensionAware).extensions.getByName("android") as com.android.build.gradle.LibraryExtension
Run Code Online (Sandbox Code Playgroud)
事实上,LibraryExtension也是不可访问的。
那么,如何将这些扩展传递或导入random.gradle.kts到我的?
android ×5
kotlin ×3
android-architecture-navigation ×2
android-room ×2
rx-java ×2
asynchronous ×1
data-binding ×1
exoplayer ×1
exoplayer2.x ×1
generics ×1
gradle ×1
gradle-kts ×1
java ×1
kotlin-dsl ×1
maven ×1
rx-java2 ×1
spring ×1
spring-boot ×1
sqlite ×1