1
Firebaseデータベースから一部のデータを読み込もうとしていますが、ondatachangeが正しいデータを取得していますが、そこからデータを取得できないようです。Firebase read addValueEventListener onDataChange value null
私はいくつかのログコマンドがあります。
だけOnDataChangeの内部の一つは、それは私にNULLポインタエラーを与えるonCreateViewのonCreate内で、値を示すとされてLog.d( "タグ"、 "名:" + product.getNameを());
私は適切な方法でいくつかの情報を得ることができる場所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;
}
}
..あなたがあなたの携帯電話上でデータを収集する必要がありますが、その間に、あなたの携帯電話を使用する必要がある場合には(あなたのアプリケーションがクラッシュしたように見える)あなたのGUIがロックされることはありませんことを確認するために起こります数時間後、onCreateViewが既に呼び出された後にOnDataChangeが返ることに気付きました。したがって、データがFireBaseから取得されるまで待機しません。私は行方不明のものがありますか? – Kurt
あなたが言ったように、あなたのコードをonDataChange()の中に入れてみませんか? 「データがある場合は、これを実行してください」という意味に変換する必要があります。 高速インターネットなどがない場合は、コードの一部(onDataChange)に時間がかかることがあります。したがって、残りのコード(onCreateView)はその間に実行されます。 あなたの携帯電話でデータを収集する必要がある一方で、携帯電話を使用する必要がある場合は、GUIがロックされないようにします(アプリがクラッシュしたように見えます)。 – user2399432
こんにちは@ user2399432は実現します私がやっていることは意味をなさないようになった。あなたはまったく正しい!移動されたtvProductSKU.setText( "SKU:" + product.getSKU()); tvProductName.setText( "Name:" + product.getName());今私は良いです! – Kurt