2017-04-17 65 views
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; 
} 
} 
+0

几个小时后,我意识到OnCreateView已被调用后,OnDataChange会返回。所以它不会等到从FireBase中检索数据。有什么我失踪? – Kurt

+1

正如你所说..你为什么不把你的代码放在onDataChange()中? 它应该是唯一的方法,因为它转换为“当有数据变更,这样做..” 这段代码(onDataChange)可能需要一段时间,如果你没有快速的互联网或等.. ..因此其余的代码(onCreateView)将同时执行。 如果您需要在手机上收集数据,但同时需要使用手机,请确保您的GUI不会被锁定(看起来像您的应用程序崩溃)。 – user2399432

+0

Hi @ user2399432现在我所做的事情没有意义。你是完全正确的!移动了tvProductSKU.setText(“SKU:”+ product.getSKU()); tvProductName.setText(“Name:”+ product.getName());现在我很好! – Kurt

回答

0

正如你所说..你为什么不把你的代码放入onDataChange()?它应该是唯一的方式,因为它转换为“当有数据变更,这样做..”

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

整个事情发生,以确保您的GUI不会被锁定(看起来像你的应用程序崩溃)的,你需要收集您的手机上,但您需要使用您的手机同时数据的情况下..