如何在Firebase中执行成功方法?

时间:2017-06-06 09:59:10

标签: android firebase firebase-realtime-database

我正在开发Android + Firebase应用程序,但由于我是两个techlogies的新手,我遇到了异步调用的问题,我还没有找到解决方案,所以希望你能帮助我。

我的Activity onCreate方法中有以下代码段:

final ArrayList<AssetLocation> assetsLocations = new ArrayList<>();
        DatabaseReference assetsLocationReference = database.getReference(FirebaseReferences.ASSETSLOCATION_REFERENCE);
        assetsLocationReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                ArrayList<String> assetsLocationSpinner = new ArrayList<String>();
                // Create an ArrayAdapter using the string array and a default spinner layout
                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    //Getting the data from snapshot
                    AssetLocation assetsLocation = postSnapshot.getValue(AssetLocation.class);
                    assetsLocations.add(AssetLocation);
                }
            }

            @Override
            public void onCancelled(DatabaseError firebaseError) {
                System.out.println("The read failed: " + firebaseError.getMessage());
            }
        });

我也有一个非常类似的电话,但我没有获得地点,而是获得类型

在这段代码之后(同样在onCreate方法内),我正在调用setScreenInfo这是一个用所述数据填充两个微调器(并做更多东西)的函数,但由于它是异步调用,我执行它时,微调器是空白的。

一旦拨打电话,我该如何执行setScreenInfo?我尝试使用.once()/.on(),但它并未被Android Studio识别为功能。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

  

在这段代码之后(在onCreate方法中也是如此),我调用了setScreenInfo,这是一个用所述数据填充微调器(并做更多东西)的函数,但由于它是异步调用,所以微调器是我执行它时是空白的。

您不能从后台线程修改UI。通常我会调用runOnUIThread,传递一个新的Runnable()和final我要通过的数据的副本。

        final String myData = "updateData";

        ActivityName.this.runOnUiThread(new Runnable() {

            public void run() {
                // use myData to update UI
            }
        });

但是,似乎已迁移到AsyncTaskConverting runOnUiThread to AsyncTask

我个人仍然使用runOnUIThread。它更明确。

答案 1 :(得分:0)

由于异步行为,您需要移动assetsLocations ArrayList的声明:

final ArrayList<AssetLocation> assetsLocations = new ArrayList<>();

onDataChange()方法中,如assetsLocationSpinner ArrayList所示。请记住,onDataChange始终称为asynchronously。这意味着在AssetLocation被调用之前执行将onDataChange类的对象添加到列表的语句。这就是为什么你的列表在该方法之外是空的。

对于其他方法,请访问此post和此post

希望不会有帮助。

答案 2 :(得分:0)

您可以使用线程:

thread = new Thread() {

    @Override
    public void run() {

        try {
            //background tasks

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //UI tasks
                }
            });
        }
        catch (JSONException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};
    thread.start();`

或者您可以使用Firebase Multi Query方法。 链接:Only load layout when firebase calls are complete