如何在Firebase查询完成之前暂停UI线程?

时间:2016-07-19 14:35:34

标签: android multithreading firebase firebase-realtime-database querying

所以我的问题就是这么说的。在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) {

            }
        });

希望你们能帮忙!

2 个答案:

答案 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();`