好吧,看来我又被卡住了。我的小部件有一半在工作,我想我知道它为什么会失败,但我不知道如何修复它。
在我的小部件服务类的 onDataSetChanged() 方法中,我调用以获取我的数据(异步)。但是系统会在数据加载之前调用 getCount(),因此大小返回 0,并且从不调用 getViewAt()。
如果我在 onDataSetChanged() 中创建一些假数据而不是调用以从 Firebase 获取真实数据,那么它会显示得很好。所以我知道它的工作原理除此之外。
我已经尝试了各种方法来让它工作,但没有运气。我不想把它变成一个很长的问题,所以我会尽量保持简单。我的问题是系统如何知道数据何时准备好?似乎没有我可以调用的方法来通知它数据现在已经存在。
我可能完全错了,但我认为这就是问题所在。onDataSetChanged() 方法不会等待,我无法告诉它。
更令人困惑的是,在我使用假静态数据的应用程序的 mockDebug 版本中,即使使用异步调用,它也确实有效。我的结论是它的加载速度必须如此之快,以至于在调用 getCount() 时它已准备就绪。但更令人困惑的是,有一段时间它也在 prodDebug 版本中工作,然后没有,也没有。据我所知,在那段时间我没有改变任何东西。无论如何,这是我能想出的唯一解释。原因是因为我可以在调试器或日志记录中看到,当我从 Firebase 获取数据时,在加载数据之前调用了 getCount(),导致它失败,但如果我使用静态数据,它会在加载数据后调用,让它成功。
我如何让它等待?或者我可能做错了什么?
谢谢。
使用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
我有一个 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 有关,但为什么它现在不起作用,我该如何解决?
如何将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,然后另一个用于其余的调用.然而,如果有人知道这是否可能仍然是好的...
注意:事实证明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架构蓝图"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".
在以下方法中,如何将第一个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 (有效)。但是,我只是更改了该方法的签名,以便可以在感觉不正确的特定方法中使用它。当然,有一种方法可以不执行此操作?