Firebase读取addValueEventListener onDataChange值null

时间:2017-04-17 20:27:38

标签: android firebase firebase-realtime-database

我正在尝试从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;
}
}

1 个答案:

答案 0 :(得分:0)

正如你所说..为什么不把你的代码放在onDataChange()中?这应该是唯一的方法,因为它转换为"当有数据变化时,请执行此操作。"

这部分代码(onDataChange)可能需要一段时间,因为你没有快速上网等等。因此,其余的代码(onCreateView)将同时执行。

如果您需要在手机上收集数据但同时需要使用手机,整个过程确保您的GUI不会被锁定(看起来您的应用程序崩溃了)。