小编mus*_*off的帖子

Android 房间例外

在使用 Android Room 时我应该考虑哪些例外情况。从我的研究中,我发现只有一种例外情况可能发生。

房间例外

这也是当你有Single<T>一个返回类型并且你有一个空的回报时。除此之外,我找不到任何其他可能引发异常的情况。

当然,如果你有一些逻辑上不正确的实现,可能会有一些例外,比如

  • 编辑方案,但未实施 Migration
  • OnConflictStrategy插入时不执行
  • 在主线程上运行房间,但不允许它 allowMainThreadQueries()

我做了一些研究并尝试了几乎所有可能的情况,主要是 RxJava 返回类型,我看到了上面提到的一个异常,就是这样。

是我运行的测试

我想确保我对每个可能的场景都有实现,并且没有一些异常和意外崩溃。我在想SQLite可能会发生异常的情况,但我相信它已经包裹在 Room 中并且会处理。(没有把握)

你能给出可能发生的任何其他可能的例外吗?

sqlite android reactive-programming rx-java android-room

21
推荐指数
1
解决办法
2561
查看次数

如何在 Kotlin 中将类型传递给泛型方法?

我有一个像下面这样的通用方法

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的任何UserStudent

val types = arrayListOf<Type>(User::class.java, Student::class.java) …
Run Code Online (Sandbox Code Playgroud)

generics parameter-passing generic-type-argument kotlin

21
推荐指数
1
解决办法
3万
查看次数

如何监听导航组件中的片段变化?

如何在新的导航组件中添加片段更改侦听器?

我有一个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目的地。

android android-fragments android-architecture-navigation

18
推荐指数
1
解决办法
1万
查看次数

在会议室中使用哪一个:LiveData或RxJava?

我正在使用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

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

如何删除 TextInputLayout 可绘制填充?

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)

有一些幼稚的解决方案,例如设置负边距,但由于我不知道填充的大小,我也无法这样做。有什么建议吗?

android android-edittext android-textinputlayout

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

如何在 Kotlin 中取消初始化 lateinit

我有一个 lateinit var 作为

lateinit var someVariable: SomeVariable
Run Code Online (Sandbox Code Playgroud)

我初始化这个值someVariable = SomeVariable(),并在需要时使用它。

在某个时候,我想将所有内容都设置为默认值并希望“取消初始化” someVariable。我怎样才能做到这一点?

不是在寻找将其类型更改为nullable对象并设置为空。我需要保持一种Non-Null类型。

kotlin kotlin-lateinit

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

如何通过数据绑定实现 ExoPlayer?

我有一个类activity_player布局,exoplayer2.ui.PlayerView我在其中创建了它exo_player_control_view,以便它覆盖 ExoPlayer 中的默认控件。所以我想在新创建的自定义控件视图中使用数据绑定,但不知道该怎么做。有什么建议吗?

这实际上是一个悬而未决的问题,但尚未解决。那么是否有人有解决方法来使exo_player_control_view数据绑定变得友好?

data-binding android kotlin exoplayer exoplayer2.x

5
推荐指数
1
解决办法
1586
查看次数

如何从对话框导航到导航组件中的片段?

我试图在导航组件中从导航DialogFragmentFragment,但是结果很奇怪。

在此处输入图片说明

当我从导航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

5
推荐指数
1
解决办法
1262
查看次数

如何链接可完成的期货

我有三个功能updateFieldFromCollection1()insertFromColletion1ToCollection2()deleteFromCollection1()现在。

这些调用并不相互依赖,但是当我想在completableFuture 中链接它们时,它们必须按照给定的顺序一个接一个地运行。

update-> insert -> delete
Run Code Online (Sandbox Code Playgroud)

调用不返回任何内容,因此我使用的是runAsyncthenRuncompletableFuture方法。并相应地将它们链接起来。我正在迭代 msgIds,它是一个字符串列表。

msgIds.stream().forEach(msgId -> CompletableFuture.runAsync(() ->  
 {updateFieldFromCollection1()}).thenRun(() -> 
 {insertFromColletion1ToCollection2()}).thenRun(() ->  
 {deleteFromCollection1()}));
Run Code Online (Sandbox Code Playgroud)

上面的代码有效(更新-> 插入-> 删除已完成)但会抛出像duplicateKey 和bulkwrite 这样的异常。我确信问题出现是因为在前一个线程完成其任务之前另一个线程正在启​​动。我希望它们异步运行,但我想通过避免冲突来规范线程。
我不确定我需要在哪里调整代码。

java spring asynchronous spring-boot completable-future

5
推荐指数
1
解决办法
1084
查看次数

如何从非 build-gradle 文件访问 Kotlin DSL 扩展?

很少有 Kotlin 扩展带有org.gradle.kotlin.dsl类似 androidpublishing等。比如说, 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到我的?

gradle maven gradle-kotlin-dsl kotlin-dsl gradle-kts

5
推荐指数
1
解决办法
2210
查看次数