Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何暂停UI线程直到Firebase查询完成?_Android_Multithreading_Firebase_Firebase Realtime Database_Querying - Fatal编程技术网

Android 如何暂停UI线程直到Firebase查询完成?

Android 如何暂停UI线程直到Firebase查询完成?,android,multithreading,firebase,firebase-realtime-database,querying,Android,Multithreading,Firebase,Firebase Realtime Database,Querying,所以我的问题说明了一切。在onCreate中,我试图查询对象,但我希望UI线程等待我查询完所有对象,以便使用它们创建用户可以看到的视图。有人知道如何使用示例代码来实现这一点吗 我是这样质疑的 Firebase cardReference = mRef.child("aReference"); cardReference.addValueEventListener(new ValueEventListener() { @Override

所以我的问题说明了一切。在onCreate中,我试图查询对象,但我希望UI线程等待我查询完所有对象,以便使用它们创建用户可以看到的视图。有人知道如何使用示例代码来实现这一点吗

我是这样质疑的

 Firebase cardReference = mRef.child("aReference");
        cardReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                    CardModel fireBaseCard = dataSnapshot1.getValue(CardModel.class);
                    testCardModelArray.add(fireBaseCard);
                    cardStack.setCardModelIDInArrayList(fireBaseCard.getCardID());
                }
                setUpCardStack();
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });

希望你们能帮忙

嗯,那么你想在一个单独的后台线程中运行你的东西

首先,创建一个私有布尔值:

private boolean isqueryfinished=false

在onCreate中写入以下内容:

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // do your stuff here
        isQueryingFinished = true;
    }
});
thread.start();
while(!isQueryingFinished);
mQueryFinishedListener = new QueryFinishedListener() {
    public void onQueryFinished() {
        // do whatever you need to do when finished
    }
};
// do your query stuff here
mQueryFinishedListener.onQueryFinished();
这将等到线程完成后,才能在onCreate()中继续您的工作

你也可以这样做:

while(!isQueryingFinished) {
    try {
        Thread.sleep(500);
    } catch(Exception ex) {/* */}
}
这样,它将每隔0.5秒(500毫秒)检查一次是否完成

但我觉得这没那么好

因此,也许最好使用某种类型的侦听器:

public interface QueryFinishedListener {
    void onQueryFinished();
}
然后在活动中定义它:

private QueryFinishedListener mQueryFinishedListener

现在在onCreate()中创建一个新的:


同样,我不认为这真的有用,因为如果你正在做一些需要更长时间的事情,UI会自动冻结。

嗯,那么你想在单独的后台线程中运行你的东西吗

首先,创建一个私有布尔值:

private boolean isqueryfinished=false

在onCreate中写入以下内容:

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // do your stuff here
        isQueryingFinished = true;
    }
});
thread.start();
while(!isQueryingFinished);
mQueryFinishedListener = new QueryFinishedListener() {
    public void onQueryFinished() {
        // do whatever you need to do when finished
    }
};
// do your query stuff here
mQueryFinishedListener.onQueryFinished();
这将等到线程完成后,才能在onCreate()中继续您的工作

你也可以这样做:

while(!isQueryingFinished) {
    try {
        Thread.sleep(500);
    } catch(Exception ex) {/* */}
}
这样,它将每隔0.5秒(500毫秒)检查一次是否完成

但我觉得这没那么好

因此,也许最好使用某种类型的侦听器:

public interface QueryFinishedListener {
    void onQueryFinished();
}
然后在活动中定义它:

private QueryFinishedListener mQueryFinishedListener

现在在onCreate()中创建一个新的:


同样,我不认为这真的有用,因为如果您正在做一些需要更长时间的事情,UI将自动冻结。

您应该使用AsyncTask。将所有代码放在doInBackground方法中,并在onPostExecute中制作一个类似微调器之类的动画`mAsyncTask=新建异步任务(){


您应该使用AsyncTask。将所有代码放在doInBackground方法中,并在onPostExecute中制作一个类似微调器之类的动画。`mAsyncTask=new AsyncTask(){


使用一个加载屏幕,直到你完成查询为止。你肯定不想冻结UI线程。这是UX地狱,也是丢失应用程序下载的可靠方法。使用某种加载机制(进度条、加载屏幕等)你最好使用启动屏幕(活动)。请参阅此示例:尝试让UI线程等待是一个坏主意(有关更多详细信息,请参阅)。请将您的想法从“先获取数据,然后更新UI”改为“获取日期后更新UI”。这方面的一个很好的例子可以在中找到,但可能也可以在大多数其他Firebase Android教程中找到。@Lubomirbebev Splashscreen通常是我要找的。使用一个加载屏幕,直到您完成查询时才关闭?您肯定不想冻结UI线程。这是UX地狱,也是丢失应用程序的一种可靠方式wnloads。使用某种加载机制(ex-progress bar,loading screen,等等)你最好使用启动屏幕(activity)。参见此示例:尝试让UI线程等待是一个坏主意(参见了解更多详细信息)。相反,将你的想法从“首先我们获取数据,然后我们更新UI”改为“当我们获取日期时,我们更新UI”。这方面的一个很好的例子可以在中找到,但可能也可以在大多数其他Firebase Android教程中找到。@Lubomirbebev Splashscreen通常就是我想要的。Firebase已经在主UI线程下运行了数据同步。将其放在另一个线程中不会有帮助。完成侦听器是一个好主意。但请记住Firebase的
ValueEventListener
已经是一个完成处理程序。Firebase已经在主UI线程下运行其数据同步。将其放入另一个线程不会有任何帮助。完成侦听器是一个好主意。但请记住,Firebase的
ValueEventListener
已经是一个完成处理程序。Firebase已经在主UI线程外运行其数据同步。将其放入
AsyncTask
不会有任何帮助。@Gorg是的,我想我会实现启动屏幕,正如Frank在上面的评论中指出的那样。Firebase已经在主UI线程外运行其数据同步。将其放入
AsyncTask
不会有任何帮助帮助。@Gorg是的,我想我会像Frank在上面的评论中指出的那样实现闪屏。