Firebase 데이터베이스에서 일부 데이터를 읽으려고합니다. ondatachange가 올바른 데이터를 받고 있지만 데이터를 가져올 수 없습니다. ("태그" "이름 :"+ product.getName())Firebase read addValueEventListener onDataChange 값 null
만 onDataChange 내부의 사람은 나에게 널 포인터 오류를 제공 onCreateView에서 onCreate 안에 값을 보여주고있다Log.d :
나는 몇 로그 명령이있다;
내가의 적절한 방법에 대한 몇 가지 정보를 얻을 수있는 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;
}
}
몇 시간 후에 onCreateView가 이미 호출 된 후 OnDataChange가 반환된다는 것을 알았습니다. 따라서 FireBase에서 데이터가 검색 될 때까지 기다리지 않습니다. 내가 빠진 것이 있습니까? – Kurt
당신이 말한대로 .. 왜 당신은 onDataChange() 안에 코드를 넣지 않으시겠습니까? "데이터가있는 경우 수행 할 작업 ..." 빠른 인터넷 등이없는 경우 코드의 일부 (onDataChange)가 오래 걸릴 수 있습니다. 나머지 코드 (onCreateView)는 그 사이에 실행될 것이다. 휴대 전화에서 데이터를 수집해야하지만 휴대 전화를 사용해야하는 경우 GUI가 잠겨 있지 않은지 확인하십시오 (앱이 손상된 것처럼 보입니다). – user2399432
안녕하세요 @ user2399432 깨닫습니다. 이제 내가하고있는 일이 의미가 없다. 너는 완전히 옳다! 이동 됨 tvProductSKU.setText ("SKU :"+ product.getSKU()); tvProductName.setText ("Name :"+ product.getName()); 지금 나는 좋다! – Kurt