尝试在Firebase中的onDataChange()之外使用数据 [英] Trying to use data outside the onDataChange() in Firebase

查看:35
本文介绍了尝试在Firebase中的onDataChange()之外使用数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新来的!请有人可以帮我.我知道在这里我正在处理异步编程,我正在尝试返回String,但它仍返回null.

I am new in this ! Please can someone help me. I know that here I am dealing with asynchronous programming, I am trying to return the String but it still returning null.

有人可以告诉我我哪里错了.

Can someone tell me where I am wrong.

public interface OnGetDataListener {
    public void onStart();
    public void onSuccess(DataSnapshot data);
    public void onFailed(DatabaseError databaseError);
}

public void mReadDataOnce(String email ,String child, final OnGetDataListener listener) {
    listener.onStart();
    myRef.child(email).child(child).limitToFirst(1).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            listener.onSuccess(dataSnapshot);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            listener.onFailed(databaseError);
        }
    });
}

private String mCheckInforInServer(String email ,String child) {
    final String[] returnvalue = new String[1];

    mReadDataOnce(email ,child, new OnGetDataListener() {

        @Override
        public void onStart() {
            //DO SOME THING WHEN START GET DATA HERE
        }

        @Override
        public void onSuccess(DataSnapshot data) {
            returnvalue[0] = data.getValue().toString();
            //DO SOME THING WHEN GET DATA SUCCESS HERE
        }

        @Override
        public void onFailed(DatabaseError databaseError) {
            //DO SOME THING WHEN GET DATA FAILED HERE
        }
    });

    return returnvalue[0] ;
}

那我叫它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.i(" ","HIMANSHU" +  mCheckInforInServer("a","name"));
    Log.i(" ","HIMANSHU" +  mCheckInforInServer("a","email"));
}

日志显示为空,我想要这些值.请帮忙!

Log is printing null, I want the values. Please help!

推荐答案

花点时间,尝试阅读并理解代码.

Take a minute, try to read your code and understand it.

在方法 mCheckInforInServer()中,代码按以下顺序执行:

Inside the method mCheckInforInServer() the code gets executed in following sequence :

  1. 初始化返回值
  2. 创建类型为 OnGetDataListener 的匿名实例.
  3. 将此类型为 OnGetDataListener 的实例传递给 mReadDataOnce()方法,并让此方法使用 OnGetDataListener 实例更改的值returnvalue (只要有需要,它就会花一些时间,因为它使用具有一定延迟的网络.此延迟将几乎在99.9999%的情况下大于执行下2条语句的延迟)
  4. 由于 mReadDataOnce()是异步运行的,因此程序控制使其继续运行并继续执行 mCheckInfoInServer()
  5. 返回当前值,在0.0001%的情况下将是您需要的值.
  1. initialize returnvalue
  2. create a anonymous instance of type OnGetDataListener.
  3. pass this instance of type OnGetDataListener to mReadDataOnce() method and let this method use OnGetDataListener instance to change the value of returnvalue whenever it wants (which will take some time to complete since its using network with some latencies. This latency will be greater than the latency in execution of next 2 statements almost in 99.9999% cases)
  4. since mReadDataOnce() operates asynchronously, the program control lets it go on and continue with the implementation of mCheckInfoInServer()
  5. return the current value of, which in 0.0001% case will be the value that you need.

所以,您只需要解决0.0001%的情况.

So, you just need to get to that 0.0001% case.

,您可以要求您的 mReadDataOnce()在main-activity内部完成后调用一个方法,这将为您提供所需的值如果一切顺利,则为99.9999%的情况.您可以尝试这样的事情:

Or, you can ask your mReadDataOnce() to invoke a method inside your main-activity when it completes, which will be give you the value that you need in 99.9999% cases, if all goes well. You can try somthing like this :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mReadDataOnce("a" ,"email", new OnGetDataListener() {

        @Override
        public void onStart() {
            //DO SOME THING WHEN START GET DATA HERE
        }

        @Override
        public void onSuccess(DataSnapshot data) {
            Log.i("", "HIMANSHU" +  data.getValue().toString());
            //DO SOME THING WHEN GET DATA SUCCESS HERE
        }

        @Override
        public void onFailed(DatabaseError databaseError) {
            //DO SOME THING WHEN GET DATA FAILED HERE
        }
    });
    mReadDataOnce("a" ,"email", new OnGetDataListener() {

        @Override
        public void onStart() {
            //DO SOME THING WHEN START GET DATA HERE
        }

        @Override
        public void onSuccess(DataSnapshot data) {
             Log.i("", "HIMANSHU" +  data.getValue().toString());            
             //DO SOME THING WHEN GET DATA SUCCESS HERE
        }

        @Override
        public void onFailed(DatabaseError databaseError) {
            //DO SOME THING WHEN GET DATA FAILED HERE
        }
    });
}

更新代码:

实际上,在这里,我试图将数据库中的值存储到Records类中.

Actually, here I am trying to store value from the database to the Records Class.

public interface OnGetDataListener {
    public void onStart();
    public void onSuccess(DataSnapshot data);
    public void onFailed(DatabaseError databaseError);
}

public void mReadDataOnce(String email ,String child, final OnGetDataListener listener) {
    listener.onStart();
    myRef.child(email).child(child).limitToFirst(1).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            listener.onSuccess(dataSnapshot);
            record.setName(dataSnapshot.getValue().toString());
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            listener.onFailed(databaseError);
        }
    });
}

然后从onCreate()中的Records类中检索值

And then retrieving the value from the Records class in onCreate()

mReadDataOnce("a" ,"email", new OnGetDataListener() {

        @Override
        public void onStart() {
            //DO SOME THING WHEN START GET DATA HERE
        }

        @Override
        public void onSuccess(DataSnapshot data) {
            Log.i("", "HIMANSHU" +  data.getValue().toString());
            record.setName(data.getValue().toString());
            //DO SOME THING WHEN GET DATA SUCCESS HERE
        }

        @Override
        public void onFailed(DatabaseError databaseError) {
            //DO SOME THING WHEN GET DATA FAILED HERE
        }
    });

    Log.i(" ","HIMANSHUKUSHWAHA"+record.getName());
    //Printing null

这篇关于尝试在Firebase中的onDataChange()之外使用数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆