当前位置: 首页 > 知识库问答 >
问题:

Firebase Android:如何依次阅读不同的参考文献

孙宏扬
2023-03-14
ref1.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

         ref2.addListenerForSingleValueEvent(new ValueEventListener() {
             @Override
             public void onDataChange(DataSnapshot dataSnapshot) {
                  //do the work
             }
         }); 
    }
}); 

共有1个答案

子车飞文
2023-03-14

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

如果所有任务成功执行,结果将发送到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);
}

@Override
public void onFailure(@NonNull Exception error) {
    Log.e(TAG, error.getMessage());
}

@Override
public void onSuccess(Customer customer) {
    // Do something with the result
}
    null

现在让我们创建两个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();
    }

}

根据文档,调用getresult()并允许RuntimeExecutionException传播已完成任务的失败。

 类似资料:
  • Angular.io API Reference - Angular 2 Reference Material with easy access to different Angular 2 items Angular Style Guide - Opinions from the Angular 2 tea - Official repo for Angular 2 implementation

  • 我有一个Kafka的话题,我正在听。然后将消息内容写入websocket通道,在该通道中我有一个订阅了该通道的SockJS客户机。这很管用。然后我创建了一个新的主题,然后添加了第二个KafKalistener。但是,当调用secong侦听器时,我看到它正在尝试处理/读取与第一个KafkaListener和主题相对应的有效负载,由于它没有被配置为这样做,因此会引发一个MessageConversio

  • 24.8 参考资料与延伸阅读 [1]通过在 /usr/src/kernels/linux-3.10.89 下面的 README 以及“ make help ”可以得到相当多的解释 核心编译的功能:可以用来测试 CPU 性能喔!因为 compile 非常耗系统资源! 2002/05/29:第一次完成 2003/02/11:重新编排与加入 FAQ 2004/06/11:原本的 2.4.xx 版本核心被

  • 23.6 参考资料与延伸阅读 [1]维基百科对 X Window 的介绍:http://en.wikipedia.org/wiki/X_Window_System [2]X Server/X client 与网络相关性的参考图示: http://en.wikipedia.org/wiki/File:X_client_sever_example.svg [3]系统的 man page: man xi

  • 22.7 参考资料与延伸阅读 [1]GNU Privacy Guard (GPG) 官方网站的介绍:http://www.gnupg.org/ RPM 包装文件管理程序:http://www.study-area.org/tips/rpm.htm 中文 RPM HOW-TO:http://www.linux.org.tw/CLDP/RPM-HOWTO.html RPM 的使用:http://lin

  • 21.9 参考资料与延伸阅读 [1]GNU 的 make 网页:http://www.gnu.org/software/make/manual/make.html 几种常见加密机制的全名: md5 (Message-Digest algorithm 5) http://en.wikipedia.org/wiki/MD5 sha (Secure Hash Algorithm) http://en.w