Java中数据库侦听器的“wait()”等价物

Java中数据库侦听器的“wait()”等价物,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在制作一个从firebase的实时数据库下载字节数据的应用程序。字节数据(基本上是从文件读取的字节)存储为字符串。当使用侦听器检索信息时,代码只是传递给侦听器,而不等待信息返回。当然,这是意料之中的。因此,作为一个解决方案,我所做的是创建一个接口,如下所示: interface DataListener { void onSuccess(DataSnapshot dataSnapshot); void onStart(); void onFailure(); }

我正在制作一个从firebase的实时数据库下载字节数据的应用程序。字节数据(基本上是从文件读取的字节)存储为字符串。当使用侦听器检索信息时,代码只是传递给侦听器,而不等待信息返回。当然,这是意料之中的。因此,作为一个解决方案,我所做的是创建一个
接口
,如下所示:

interface DataListener {
    void onSuccess(DataSnapshot dataSnapshot);
    void onStart();
    void onFailure();
}  
static void readData(DatabaseReference ref, final DataListener listener) {
    listener.onStart();

    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            listener.onSuccess(dataSnapshot);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            listener.onFailure();
        }
    });

}
然后我有一个类似这样的方法:

interface DataListener {
    void onSuccess(DataSnapshot dataSnapshot);
    void onStart();
    void onFailure();
}  
static void readData(DatabaseReference ref, final DataListener listener) {
    listener.onStart();

    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            listener.onSuccess(dataSnapshot);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            listener.onFailure();
        }
    });

}
因此,基本上我有一个等于false的布尔值,只有当侦听器成功时才变为true。但这对我的工作经理不起作用。由于这个方法也被绕过,我又回到了原来的问题。我希望work manager代码停止,以便数据库侦听器返回一些内容,将获得的信息写入文件,然后最终返回结果。以下是工作经理代码:

@NonNull
@Override
public Result doWork() {

    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            try {
                String path = getApplicationContext()
                .getExternalFilesDir(null);
                java.io.File directory = new java.io.File(path);

                if (!directory.exists()) directory.mkdirs();
                FileOutputStream output = new FileOutputStream(directory + 
                File.separator + name + "." + extension);

                for (DataSnapshot fileSnap) {
                    output.write(getBytesFromString(fileSnap.child(byteInfo)
                    .getValue(String.class)));
                    Log.d(TAG, "onDataChange: output.write() going on");
                }

                output.flush();
                output.close();

                Log.d(TAG, "onDataChange: Downloaded the file");

            } catch (Exception ignored) {
                Log.d(TAG, "Failed writing");
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
             Log.d(TAG, "Failed");
        }
    });


    Log.d(TAG, "doWork: returned the result");
    return Result.success;
}
我知道TypeScript中有一个
await()
,我用于云函数。因此,我的问题是:

我可以暂停代码以便完成编写过程吗?因为如果代码没有暂停,进程将在主线程上完成,我的UI将冻结。更重要的是,这个过程需要在后台线程上完成,因为我将得到一个大字符串,并将其转换为字节数组,然后写入它。那么,如何在后台写入字节数据呢


提前谢谢

ListenableWorker
似乎正是我想要的。您能在这里添加一个示例代码吗?文档对我来说没有多大意义(我很沮丧)。谢谢有关
ListenableWorker
的详细信息,请参阅。请注意,
ListenableWorker
doWork()
方法在主应用程序线程上运行——您需要调用一些本身在后台线程上运行的方法。如果Firebase没有为您提供在后台线程上调用侦听器的选项,请将链接工作与
WorkManager
一起使用,让您的磁盘I/O由其后台线程上单独的
工作者处理。对不起,我应该使用的术语是。“我希望它在我的命令下停止”--您可以。任务的输出。那么您就不使用
ListenableWorker
。使用
ListenableWorker
,表示您的监听器本身成功了
doWork()
返回一个
未来
,而不是
结果
。在您的情况下,您将在
onDataChange()
onCancelled()中更新
Future
。而且,在
onDataChange()
中,您有您的数据。
ListenableWorker
似乎就是我想要的。您能在这里添加一个示例代码吗?文档对我来说没有多大意义(我很沮丧)。谢谢有关
ListenableWorker
的详细信息,请参阅。请注意,
ListenableWorker
doWork()
方法在主应用程序线程上运行——您需要调用一些本身在后台线程上运行的方法。如果Firebase没有为您提供在后台线程上调用侦听器的选项,请将链接工作与
WorkManager
一起使用,让您的磁盘I/O由其后台线程上单独的
工作者处理。对不起,我应该使用的术语是。“我希望它在我的命令下停止”--您可以。任务的输出。那么您就不使用
ListenableWorker
。使用
ListenableWorker
,表示您的监听器本身成功了
doWork()
返回一个
未来
,而不是
结果
。在您的情况下,您将在
onDataChange()
onCancelled()中更新
Future
。在
onDataChange()
中,您有您的数据。