Firebase Android:如何顺序读取不同的引用

Firebase Android:如何顺序读取不同的引用,第1张

概述在我的一项Android活动中,我需要对Firebase执行多个查询,以便最终向用户显示内容.总之,我需要检查用户参考以检查他当前所处的课程步骤,然后我需要阅读课程的内容以加载它.我目前正在做的是我有两个嵌套的侦听器,如下所示:ref1.addListenerForSingleValueEvent(newValueEventLi

在我的一项Android活动中,我需要对Firebase执行多个查询,以便最终向用户显示内容.

总之,我需要检查用户参考以检查他当前所处的课程步骤,然后我需要阅读课程的内容以加载它.

我目前正在做的是我有两个嵌套的侦听器,如下所示:

ref1.addListenerForSingleValueEvent(new ValueEventListener() {    @OverrIDe    public voID onDataChange(DataSnapshot dataSnapshot) {         ref2.addListenerForSingleValueEvent(new ValueEventListener() {             @OverrIDe             public voID onDataChange(DataSnapshot dataSnapshot) {                  //do the work             }         });     }}); 

当您需要顺序执行此查询时,有更好的方法吗?

解决方法:

TL; DR

就像Parse与Bolts一样,Google也提供了一个实现JavaScript promises的任务框架.因此,您可以创建一系列任务,而不是嵌套侦听器.

如果所有任务成功执行,结果将发送到addOnSuccessListener.

如果在用例执行期间其中任何一个失败,则序列将被中止,异常将传递到addOnFailureListener.

public Task<Course> execute() {    return Tasks.<VoID>forResult(null)        .then(new GetUser())        .then(new GetCourse());}public voID updateInBackground() {    Tasks.<VoID>forResult(null)        .then(new GetUser())        .then(new GetCourse())        .addOnSuccessListener(this)        .addOnFailureListener(this);}@OverrIDepublic voID onFailure(@NonNull Exception error) {    Log.e(TAG, error.getMessage());}@OverrIDepublic voID onSuccess(Customer customer) {    // Do something with the result}

描述

假设您希望从Firebase下载两个User和Course类型的对象.

您需要使用Tasks API创建序列的第一个任务.您的选项是:

>使用Tasks.forResult创建成功的任务
>创建TaskCompletionSource,设置结果或异常值,然后返回任务.
>从callable创建任务.

我更喜欢第一种选择,主要是因为代码易读性.如果您需要在自己的执行程序中运行任务,则应使用第一个或第二个选项.

现在让我们创建两个Continuation任务,每个下载两个:

class GetUser implements Continuation<VoID, Task<User>> {    @OverrIDe    public Task<User> then(Task<VoID> task) {        final taskcompletionsource<User> tcs = new taskcompletionsource();        ref1.addListenerForSingleValueEvent(new ValueEventListener() {            @OverrIDe            public voID onCancelled(DatabaseError error) {                tcs.setException(error.toException());            }            @OverrIDe            public voID onDataChange(DataSnapshot snapshot) {                tcs.setResult(snapshot.getValue(User.class));            }        });        return tcs.getTask();    }}

class GetCourse implements Continuation<User, Task<Course>> {    @OverrIDe    public Task<Course> then(Task<User> task) {        final User result = task.getResult();        final taskcompletionsource<Course> tcs = new taskcompletionsource();        ref2.addListenerForSingleValueEvent(new ValueEventListener() {            @OverrIDe            public voID onCancelled(DatabaseError error) {                tcs.setException(error.toException());            }            @OverrIDe            public voID onDataChange(DataSnapshot snapshot) {                tcs.setResult(snapshot.getValue(Course.class));            }        });        return tcs.getTask();    }}

根据the documentation,调用getResult()并允许RuntimeExecutionException传播以从已完成的Task传播失败.

RuntimeExecutionException将被解包,使得continueWith(Continuation)continueWithTask(Continuation)返回的任务失败并返回原始异常.

总结

以上是内存溢出为你收集整理的Firebase Android:如何顺序读取不同的引用全部内容,希望文章能够帮你解决Firebase Android:如何顺序读取不同的引用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1102413.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存