【问题标题】:Firebase read addValueEventListener onDataChange value nullFirebase 读取 addValueEventListener onDataChange 值 null
【发布时间】: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


【解决方案1】:

正如你所说.. 你为什么不把你的代码放在 onDataChange() 里面?它应该是唯一的方法,因为它转换为“当有数据更改时,执行此操作..”

这部分代码 (onDataChange) 可能会在您没有快速互联网的情况下需要一段时间。因此其余代码 (onCreateView) 将同时执行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多