异步调用的解决方法从Firebase读取

时间:2017-05-05 15:09:12

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

我是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

谢谢。

2 个答案:

答案 0 :(得分:0)

看看这个post。有2个链接解释了如何从Firebase和query

获取wait Firebase async retrive data in android数据

希望它有所帮助。

答案 1 :(得分:0)

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