小编Mic*_*ovo的帖子

小部件服务在尝试填充集合之前不会等待数据

好吧,看来我又被卡住了。我的小部件有一半在工作,我我知道它为什么会失败,但我不知道如何修复它。

在我的小部件服务类的 onDataSetChanged() 方法中,我调用以获取我的数据(异步)。但是系统会在数据加载之前调用 getCount(),因此大小返回 0,并且从不调用 getViewAt()。

如果我在 onDataSetChanged() 中创建一些假数据而不是调用以从 Firebase 获取真实数据,那么它会显示得很好。所以我知道它的工作原理除此之外。

我已经尝试了各种方法来让它工作,但没有运气。我不想把它变成一个很长的问题,所以我会尽量保持简单。我的问题是系统如何知道数据何时准备好?似乎没有我可以调用的方法来通知它数据现在已经存在。

我可能完全错了,但我认为这就是问题所在。onDataSetChanged() 方法不会等待,我无法告诉它。

更令人困惑的是,在我使用假静态数据的应用程序的 mockDebug 版本中,即使使用异步调用,它也确实有效。我的结论是它的加载速度必须如此之快,以至于在调用 getCount() 时它已准备就绪。但更令人困惑的是,有一段时间它也在 prodDebug 版本中工作,然后没有,也没有。据我所知,在那段时间我没有改变任何东西。无论如何,这是我能想出的唯一解释。原因是因为我可以在调试器或日志记录中看到,当我从 Firebase 获取数据时,在加载数据之前调用了 getCount(),导致它失败,但如果我使用静态数据,它会在加载数据后调用,让它成功。

我如何让它等待?或者我可能做错了什么?

谢谢。

android android-widget firebase-realtime-database

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

如何从Android磨损并发症提供商在表盘上绘制图标?

使用Complications API有一个图标类型,但是在绘制图标时我不知道该怎么做.

当我绘制实际的表盘时,似乎没有drawIcon方法.例如像canvas.drawIcon(icon).我只能看到如何绘制位图.

在我的drawComplications方法中我有这个:

} else if (complicationData.getType() == ComplicationData.TYPE_ICON) {
                Icon icon = complicationData.getIcon();
Run Code Online (Sandbox Code Playgroud)

然后我如何将图标绘制到画布?

这里的代码实验室没有告诉我们如何绘制图标:https://codelabs.developers.google.com/codelabs/complications/index.html?index =..% 2F..%2Findex#3

我可以只将所有drawable复制到本地可穿戴模块,并通过传入一个字符串绕过图标​​类型,然后从那里绘制相应的位图.但必须有一种方法可以从图标中提取,否则为什么会这样呢?

我也无法从谷歌搜索中找到如何将图标转换为位图,但这似乎也很愚蠢,因为我不得不首先将位图转换为图标,因为API需要一个图标.

任何帮助赞赏.

谢谢.

android android-wear-data-api android-wear-2.0 android-wear-complication wear-os

4
推荐指数
1
解决办法
511
查看次数

使用 DialogFragment 时,Espresso 不会在微调器中选择项目

情况

我有一个 Espresso 测试,可以从旋转器中选择一个项目。当我运行此测试以使微调器显示在活动(电话模式)上时,它会使用以下代码正确选择项目:

onView(withId(R.id.spinner)).perform(scrollTo()).perform(click());
onData(allOf(is(instanceOf(String.class)),
    is("Spinner item string")))
    .perform(click());
Run Code Online (Sandbox Code Playgroud)

其中 ID 和字符串替换为实际值。

问题

但是,如果微调器位于 DialogFragment(平板电脑模式)上,那么相同的代码就会挂起,并且似乎无法在微调器中找到该项目。它可以单击微调器,但不能再单击该项目。据我所知,没有其他区别。

有没有人遇到过这个问题或知道我错过了什么?当微调器位于片段上时,我需要做些什么不同的事情吗?我在文档或问题跟踪器中看不到任何内容。任何建议或想法表示赞赏。这可能是一个错误,但它现在不会被发现似乎并不是一件奇怪的事情,所以我认为我做错了什么的可能性更大。

也许与 onData 有关,但为什么它现在不起作用,我该如何解决?

android android-espresso

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

RxJava2如何将Single链接到Completable,以便在Completable完成时订阅它

如何将Single链接到Completable,以便在Completable完成时获得订阅?

repository.downloadUser() 是单身.

基于调试,似乎此方法中的Single被调用但从未订阅(即该downloadUser()方法被调用但是它创建的Single内部没有代码被调用).

问题是,如何repository.downloadUser()使用原始订阅者在链中订阅Single?我错过了什么或做错了什么?或者这不可能吗?

fun login(username: String, password: String): Completable {    
    return repository.login(username, password)
        .andThen {
            repository.downloadUser() // This is a Single
                .flatMap { downloadedUser ->
                    user = downloadedUser
                    it.toSingle()
                }
                // When I get this part working there are other things I want to 
                // chain as well.
}
Run Code Online (Sandbox Code Playgroud)

编辑:我可能只是把它分成两个调用,一个用于Completable,然后另一个用于其余的调用.然而,如果有人知道这是否可能仍然是好的...

android rx-java2

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

RxJava Single.toCompletable()似乎以某种方式破坏了Single

注意:事实证明toCompletable()并不是错误,而是调用代码。调用代码使得更改此方法使其起作用(或不起作用)。


我有以下方法。它返回一个Single。有用。执行内部代码,以便remoteDataSource Single下载数据和其中的代码doOnSuccess运行中,我可以在其中断点。

但是,如果像第二个示例中那样将其转换为可完成对象,它将停止工作。不会下载数据,并且其中的代码doOnSuccess永远不会运行。

我想在此方法中将其转换为Completable,因为调用此方法的方法不需要数据,仅需要成功/错误结果。

知道为什么会这样吗?

它在文档中说

返回一个{@link Completable},它会丢弃{@link Single}的结果,并在此源{@link Single}调用{@code onSuccess}时调用{@code onComplete}。错误终端事件被传播。

但是我认为这意味着它将丢弃调用方法的内容,而不是当前方法的内容。通过转换为Completable,即使remoteDataSource Single也不会下载数据。

工作方式:

override fun downloadSomethingList(): Single<List<Something>> {
    return remoteDataSource.getSomethingList(getHash(SOMETHING_HASH))
      .doOnSuccess { it: Map<String, List<Something>>
        saveHash(SOMETHING_HASH, it.keys.first())
        localDataSource.replaceSomethingList(it.values.first())
      }.map {
          it.values.first()
      }
}
Run Code Online (Sandbox Code Playgroud)

破碎:

override fun downloadSomethingList(): Completable {
    return remoteDataSource.getSomethingList(getHash(SOMETHING_HASH))
        .doOnSuccess { it: Map<String, List<Something>>
          saveHash(SOMETHING_HASH, it.keys.first())
          localDataSource.replaceSomethingList(it.values.first())
        }.toCompletable()
}
Run Code Online (Sandbox Code Playgroud)

更新:

好的,这是我的调用方法。是的,这有点复杂。也许那里的东西导致了问题。

fun downloadData(): Completable {
    ...
    return repository.downloadThing1()
        .flatMap { downloadedThing1 ->
            ...
            repository.downloadThing2().toSingle()
        }
        .flatMap {
            repository.getThing2() …
Run Code Online (Sandbox Code Playgroud)

android rx-java2

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

Android架构蓝图"todo-mvp-dagger",哪里是@Provides for TasksRepository?

从这里查看Android架构蓝图"todo-mvp-dagger":https://github.com/googlesamples/android-architecture.

我正在尝试理解Dagger2实现,我似乎无法弄清楚他们如何让Dagger2提供TasksRepository.

它们具有@Provides"provideTasksLocalDataSource"和"provideTasksRemoteDataSource",但实际TaskRepository的位置在哪里?

在TodoApplication类中,他们有:

@Inject
TasksRepository tasksRepository;
Run Code Online (Sandbox Code Playgroud)

怎么能在没有@Provides的情况下注入它呢?

如果我尝试在我自己的应用程序中使用相同的方法,我会收到此错误:

如果没有@ Provide-或@ Produces-annotated方法,则无法提供

所以我在Blueprints代码中到处寻找,但我看不出他们是如何做到的.是否有一些技巧允许他们没有@Provides?它肯定会建立起来,所以他们以某种方式绕过它.

有人在实际的github页面上问了同样的问题,但在撰写本文时没有答案.https://github.com/googlesamples/android-architecture/issues/561.

我在撰写本文时的最新提交是"082bd72d62472f9caadd2979046067fb928bbfef".

java android kotlin dagger dagger-2

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

RxJava Single到Completable to Single-如何将第一个Single的结果传递给第二个Single

在以下方法中,如何将第一个Single的结果传递给第二个Single?

如现在所写,返回时somethingId为空。如果我将返回值更改为Single.just(somethingId)空字符串以外的其他值,它将返回该值。

有趣的是,如果我在方法中断点,它会在第5行和第6行之前停在第7行。

andThen在线7 的文档说:

返回一个Single,它将订阅此Completable,完成后将订阅{@code next} SingleSource。

为什么它似乎按照该顺序执行和/或有更好的方法来执行此操作?

1 override fun downloadSomething(): Single<String> {
2    var somethingId = ""
3    return remoteDataSource.downloadSomething() // this is a Single
4        .flatMapCompletable { something ->
5            somethingId = something.id
6            saveSomething(something) // this is a Completable
7        }.andThen(Single.just(somethingId))
8 }
Run Code Online (Sandbox Code Playgroud)

在这一点上,我唯一想做的就是为第saveSomething()6行的方法返回Single (有效)。但是,我只是更改了该方法的签名,以便可以在感觉不正确的特定方法中使用它。当然,有一种方法可以不执行此操作?

android rx-java2

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