【问题标题】:workaround for async call to read from Firebase从 Firebase 读取异步调用的解决方法
【发布时间】:2017-05-05 15:09:12
【问题描述】:

我是 Android 和 Firebase 环境的新手,但我正在努力!

我正在开发一个 Android 应用,我需要读取一些与 Firebase 数据库中的孩子相关的值。在这个初始读取之后,我需要修改/更新这些值并将它们写入同一个孩子。

public class MainActivity extends Activity {
    public  static  class  Shoe extends JSONObject  {
        private String  name;
        private int     size;
        Shoe(){      
               // Default constructor required for calls to 
               // DataSnapshot.getValue(Shoe.class)
        }
        Shoe( String nm, int sz)  { this.name = nm; this.size = sz;  }
        public int      getSize()          { return this.size; }
        public void     setSize(int sz)    { this.size = sz; }
        public String   getName()          { return this.name;}
        public void     setName(String nm) {this.name = nm; }
    }
      @Override
      protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG, "onCreate");

            // Write a message to the database
            FirebaseDatabase    database      = FirebaseDatabase.getInstance();
            database.setPersistenceEnabled(true);

            DatabaseReference   myRefTarget   = database.getReference("target");

            Shoe obj1 = new Shoe("item ID 1", 99);
            Shoe obj2 = new Shoe("item ID 2", 1000);

            final Shoe obj_old = new Shoe();

            Shoe obj_new = new Shoe();

            DatabaseReference myRefDeviceA = myRefTarget.child("deviceA").getRef();
            myRefDeviceA.keepSynced(true);

            myRefDeviceA.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot)
                {
                    obj_old.setName( dataSnapshot.getValue(Shoe.class).getName());
                    obj_old.setSize( dataSnapshot.getValue(Shoe.class).getSize());

                    Log.d(TAG_CLOUD, "from onDataChange: deviceA = " + obj_old.getName() + ", " + obj_old.getSize());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {   
                }
            });
           // HERE 
           Log.d(TAG_CLOUD, "Name = " + obj_old.getName() + ", Size = " + obj_old.getSize());
}

我遇到的问题是读取操作是异步完成的..

D/FROM CLOUD: Name = null, Size = 0
D/FROM CLOUD: from onDataChange: deviceA = item ID 1, 99

如何调整/修改源代码以首先“读取”给我不同于 null 和 '0' 的值? “这里”线 例如。

Name = item ID 1 Size = 99

谢谢。

【问题讨论】:

    标签: android firebase firebase-realtime-database firebase-cloud-messaging


    【解决方案1】:

    您不应该在 UI 线程上执行网络操作。 如果要在活动中显示数据,则应在 onCreate 方法中显示加载对话框,然后在获取数据后关闭对话框并更新活动视图

    【讨论】:

      猜你喜欢
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 2017-03-06
      • 2014-09-13
      相关资源
      最近更新 更多