【问题标题】:How to execute success method in Firebase?如何在 Firebase 中执行成功方法?
【发布时间】:2017-06-06 09:59:09
【问题描述】:

我正在开发一个 Android+Firebase 应用,但由于我对这两种技术都不熟悉,所以我在异步调用方面遇到了问题,我还没有找到解决方案,所以希望你能帮助我。

我的 Activity 的 onCreate 方法中有以下 sn-p:

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());
            }
        });

我也有一个非常相似的调用,但我得到的是 Types,而不是 Locations

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

拨打电话后如何执行setScreenInfo?我尝试使用 .once()/.on(),但它没有被 Android Studio 识别为函数。

感谢您的帮助!

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    在这段代码之后(也在 onCreate 方法内部),我调用了 setScreenInfo,它是一个用所述数据填充两个微调器(并做更多事情)的函数,但由于它是一个异步调用,所以微调器在我执行它。

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

            final String myData = "updateData";
    
            ActivityName.this.runOnUiThread(new Runnable() {
    
                public void run() {
                    // use myData to update UI
                }
            });
    

    但是,似乎有迁移到 AsyncTask : Converting runOnUiThread to AsyncTask

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

    【讨论】:

      【解决方案2】:

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

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

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

      其他方法请访问postpost

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        你可以使用线程:

        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 多查询方法。 链接:Only load layout when firebase calls are complete

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          • 2013-03-30
          • 2019-07-07
          • 1970-01-01
          • 2015-11-29
          • 2018-11-16
          相关资源
          最近更新 更多