我正在尝试从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;
}
}
答案 0 :(得分:0)
正如你所说..为什么不把你的代码放在onDataChange()中?这应该是唯一的方法,因为它转换为"当有数据变化时,请执行此操作。"
这部分代码(onDataChange)可能需要一段时间,因为你没有快速上网等等。因此,其余的代码(onCreateView)将同时执行。
如果您需要在手机上收集数据但同时需要使用手机,整个过程确保您的GUI不会被锁定(看起来您的应用程序崩溃了)。