2017-10-10 59 views
0

我是新手!请有人可以帮助我。 我知道在这里我正在处理异步编程,我试图返回字符串,但它仍然返回null。试图在Firebase中使用onDataChange()以外的数据

有人可以告诉我我错在哪里。

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

日志是印刷空,我想要的值。请帮忙!

回答

0

花一点时间,尝试阅读你的代码并理解它。

内部mCheckInforInServer()的代码获取在下列顺序执行的方法,包括:

  1. 初始化returnvalue
  2. 创建OnGetDataListener类型的匿名实例。
  3. OnGetDataListener类型的这种情况下传递给mReadDataOnce()方法,让该方法使用OnGetDataListener实例来改变returnvalue每当它想(这需要一定的时间价值来完成,因为其使用网络,一些延迟。这种延迟会大于在接下来的2条语句的执行延迟几乎在99.9999%的情况下)
  4. 因为mReadDataOnce()异步操作,程序控制让它继续下去,并继续与mCheckInfoInServer()
  5. 回报的当前值的实现,在0.0001%的情况下将是你需要的价值。

所以,你只需要达到0.0001%的情况。

或者,你可以问你的mReadDataOnce()调用您的主要活动中的方法当它完成,这将是给你,你在99.9999%的情况下所需要的值,如果一切进展顺利。你可以尝试财产以后这样的:

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

更新代码:

其实,我在这里从数据库中的记录类试图储值。

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从记录类检索值()

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 
+0

感谢您的答复。但我试图访问onCreate()中的mReadDataOnce()方法之外的返回值。 –

+0

因此,例如,您希望在主活动中使用名为'doSomethin()'的方法使用该数据。然后,你可以简单地在'OnGetDataListener#onSuccess()' – ZeekHuge

+0

的实现中调用'doSomething(data)'我试过了,但它仍然返回null。 –