2017-02-09 61 views
1

我想从addValueEventListener()接收一个字符串,用于从数据库Firebase转售数据。数据正确到达。从addValueEventListener退回字符串Firebase

但是,如果确定要将字符串从该方法中移出以在另一个方法中使用它,则不会返回任何内容。

你有小费吗?

我已经尝试过putExtras,也有意创建一个方法,但它没有奏效。

final DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference().child("user-daily").child(getUid()).child("2017-Year"); 
mPostReference.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     final ArrayList<String> labels = new ArrayList<String>(); 
     for (DataSnapshot data : dataSnapshot.getChildren()){ 
      final DailyItem dailyItem = data.getValue(DailyItem.class); 
      labels.add(dailyItem.mese); 



     } 
     title.setText(labels.get(position)); 

     a = title.getText().toString(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Toast.makeText(view.getContext(),"database error", 
       Toast.LENGTH_SHORT).show(); 
    } 
}); 

//this return null... why? 
String title = a; 

回答

3

数据是从Firebase异步加载的。在运行title = a时,onDataChange方法尚未被调用。在调试器中设置一些断点来验证这一点,这对了解异步加载如何工作至关重要。

解决的办法是将问题从“首先获取对象,然后用标题做blabla”重新构建为“开始获取对象;一旦对象可用,请使用标题做blabla”。

在这段代码转换为:

final DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference().child("user-daily").child(getUid()).child("2017-Year"); 
mPostReference.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     final ArrayList<String> labels = new ArrayList<String>(); 
     for (DataSnapshot data : dataSnapshot.getChildren()){ 
      final DailyItem dailyItem = data.getValue(DailyItem.class); 
      labels.add(dailyItem.mese); 



     } 
     title.setText(labels.get(position)); 

     // Do blabla with the title 
     String title = title.getText().toString(); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Toast.makeText(view.getContext(),"database error", 
       Toast.LENGTH_SHORT).show(); 
    } 
}); 

许多开发商新火力地堡(和其他现代Web API,因为他们所有的工作这种方式)这个问题的斗争。所以,我建议你也检查了他们的问题和答案:

+0

谢谢你的回复!但是,这并不能解决我的问题,因为我仍然无法提供此字符串。我会看你离开我的应用程序。谢谢。 – hulon

+0

您试图使异步代码同步。请参阅http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener/33204705#33204705 –

+0

谢谢理解!我会在稍后给你的链接中查找答案,我感谢你。最后一口井,只是一个猜测。如果我除了在Firebase给定的本地被检测者身上,例如在共享偏好的情况下,那么我可以在方法之外找回它? – hulon

0

您可以通过使用GenericTypeIndicator检索整个列表。按照官方指南here