【发布时间】:2017-09-13 12:27:30
【问题描述】:
我正在尝试从 Firebase 数据库中读取一些数据,ondatachange 正在获取正确的数据,但我似乎无法从中获取数据。
我有几个日志命令:
Log.d("Tag","name: "+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;
}
}
【问题讨论】:
-
几个小时后,我意识到 OnDataChange 在 onCreateView 已被调用后返回。所以它不会等到从 FireBase 中检索到数据。有什么我想念的吗?
-
正如你所说..你为什么不把你的代码放在 onDataChange() 里面?它应该是唯一的方法,因为它转换为“当有数据更改时,请执行此操作..”如果您没有快速的互联网,您的这部分代码(onDataChange)可能需要一段时间..因此其余部分代码(onCreateView)将同时执行。整个过程是为了确保您的 GUI 不会被锁定(看起来像您的应用程序崩溃),以防您需要在手机上收集数据但同时您需要使用手机。..
-
嗨@user2399432 现在意识到我所做的没有意义。你完全正确!移动了 tvProductSKU.setText("SKU:" + product.getSKU()); tvProductName.setText("名称:" + product.getName());现在我很好!
-
我发布了我的评论作为答案,以防您想将其选为接受的回答。谢谢! :D
标签: android firebase firebase-realtime-database