1
我想从Firebase数据库读取一些数据,ondatachange获取正确的数据,但我似乎无法从中获取数据。Firebase读取addValueEventListener onDataChange值null
我有几个日志命令:
Log.d( “标签”, “名称:” + product.getName());
只有一个内部onDataChange正显示出价值,里面的onCreate和onCreateView这让我空指针错误
我现在认识到这是因为onDataChange是异步我在哪里可以得到的正确方法的一些信息处理这个?
谢谢!
public class ProductDetailFragment extends Fragment {
private EventBus eventBus = EventBus.getDefault();
private String productPushID;
private ValueEventListener valueEventListener;
private DatabaseReference prodIDRef;
private Product product;
private TextView tvProductSKU;
private TextView tvProductName;
public ProductDetailFragment(){
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
ProductClickedEvent productClickedEvent = eventBus.getStickyEvent(ProductClickedEvent.class);
if(productClickedEvent != null) {
eventBus.removeStickyEvent(productClickedEvent);
productPushID = productClickedEvent.getProductPushID();
}
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference prodRef = rootRef.child("products");
prodIDRef = prodRef.child(productPushID);
valueEventListener = prodIDRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Product sProduct = dataSnapshot.getValue(Product.class);
if (sProduct == null) {
getActivity().finish();
return;
}
product= sProduct;
Log.d("onDataChange","name: "+product.getName());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//Log.d("onCreate","name: "+product.getName());
}
@Override
public void onAttach(Context context){
super.onAttach(context);
eventBus.register(this);
}
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEvent(ProductClickedEvent productClickedEvent) {
Log.d("SubScribe",productClickedEvent.getProductPushID());
productPushID = productClickedEvent.getProductPushID();
}
@Override
public void onDetach(){
super.onDetach();
eventBus.unregister(this);
}
@Override
public void onDestroy() {
super.onDestroy();
prodIDRef.removeEventListener(valueEventListener);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//Log.d("onCreateView","name: "+product.getName());
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_product_detail, container, false);
tvProductSKU = (TextView) view.findViewById(R.id.tvProductSKU);
tvProductName = (TextView) view.findViewById(R.id.tvProductName);
tvProductSKU.setText("SKU: " + product.getSKU());
tvProductName.setText("Name: " + product.getName());
return view;
}
}
几个小时后,我意识到OnCreateView已被调用后,OnDataChange会返回。所以它不会等到从FireBase中检索数据。有什么我失踪? – Kurt
正如你所说..你为什么不把你的代码放在onDataChange()中? 它应该是唯一的方法,因为它转换为“当有数据变更,这样做..” 这段代码(onDataChange)可能需要一段时间,如果你没有快速的互联网或等.. ..因此其余的代码(onCreateView)将同时执行。 如果您需要在手机上收集数据,但同时需要使用手机,请确保您的GUI不会被锁定(看起来像您的应用程序崩溃)。 – user2399432
Hi @ user2399432现在我所做的事情没有意义。你是完全正确的!移动了tvProductSKU.setText(“SKU:”+ product.getSKU()); tvProductName.setText(“Name:”+ product.getName());现在我很好! – Kurt