所以我的问题就是这么说的。在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) {
}
});
希望你们能帮忙!
答案 0 :(得分:0)
嗯,所以你想在一个单独的后台线程中运行你的东西?
首先,创建一个私有布尔值:
private boolean isQueryingFinished = false
在onCreate中写下:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// do your stuff here
isQueryingFinished = true;
}
});
thread.start();
while(!isQueryingFinished);
这将等到线程完成后继续使用onCreate()
您也可以这样做:
while(!isQueryingFinished) {
try {
Thread.sleep(500);
} catch(Exception ex) {/* */}
}
这样,如果完成,它将每隔0.5秒(500毫秒)检查一次。
但我不认为那太好了。
所以也许使用某种倾听者会更好:
public interface QueryFinishedListener {
void onQueryFinished();
}
然后在您的活动中定义它:
private QueryFinishedListener mQueryFinishedListener;
现在在onCreate()中创建一个新的:
mQueryFinishedListener = new QueryFinishedListener() {
public void onQueryFinished() {
// do whatever you need to do when finished
}
};
// do your query stuff here
mQueryFinishedListener.onQueryFinished();
同样,我不认为这非常有用,因为如果你做的事情需要更长时间,那么UI会自动冻结。
答案 1 :(得分:0)
您应该使用AsyncTask。将所有代码放在doInBackground方法中,并在onPostExecute中创建一个类似微调器的动画。 `mAsyncTask = new AsyncTask(){
@Override
protected String doInBackground(Void... voids) {
//put your code here
}
@Override
protected void onPostExecute(String s) {
//make a spinner here
}
};
mAsyncTask.execute();`