2017-04-17 11 views
1

Firebaseデータベースから一部のデータを読み込もうとしていますが、ondatachangeが正しいデータを取得していますが、そこからデータを取得できないようです。Firebase read addValueEventListener onDataChange value null

私はいくつかのログコマンドがあります。

Log.d( "タグ"、 "名:" + product.getNameを());

だけOnDataChangeの内部の一つは、それは私にNULLポインタエラーを与えるonCreateViewのonCreate内で、値を示すとされて

私は適切な方法でいくつかの情報を得ることができる場所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

..あなたがあなたの携帯電話上でデータを収集する必要がありますが、その間に、あなたの携帯電話を使用する必要がある場合には(あなたのアプリケーションがクラッシュしたように見える)あなたのGUIがロックされることはありませんことを確認するために起こります数時間後、onCreateViewが既に呼び出された後にOnDataChangeが返ることに気付きました。したがって、データがFireBaseから取得されるまで待機しません。私は行方不明のものがありますか? – Kurt

+1

あなたが言ったように、あなたのコードをonDataChange()の中に入れてみませんか? 「データがある場合は、これを実行してください」という意味に変換する必要があります。 高速インターネットなどがない場合は、コードの一部(onDataChange)に時間がかかることがあります。したがって、残りのコード(onCreateView)はその間に実行されます。 あなたの携帯電話でデータを収集する必要がある一方で、携帯電話を使用する必要がある場合は、GUIがロックされないようにします(アプリがクラッシュしたように見えます)。 – user2399432

+0

こんにちは@ user2399432は実現します私がやっていることは意味をなさないようになった。あなたはまったく正しい!移動されたtvProductSKU.setText( "SKU:" + product.getSKU()); tvProductName.setText( "Name:" + product.getName());今私は良いです! – Kurt

答えて

0

あなたが言ったように、なぜコードをonDataChange()に入れないのですか?これは唯一の方法である必要があります。「データがある場合は、これを実行してください」

高速インターネットなどがない場合は、コードの一部(onDataChange)に時間がかかることがあります。したがって、残りのコード(onCreateView)はその間に実行されます。

全部が

関連する問題