Android 如何暂停UI线程直到Firebase查询完成?
所以我的问题说明了一切。在onCreate中,我试图查询对象,但我希望UI线程等待我查询完所有对象,以便使用它们创建用户可以看到的视图。有人知道如何使用示例代码来实现这一点吗 我是这样质疑的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
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在上面的评论中指出的那样实现闪屏。