2017-04-17 3 views
1

Firebase 데이터베이스에서 일부 데이터를 읽으려고합니다. ondatachange가 올바른 데이터를 받고 있지만 데이터를 가져올 수 없습니다. ("태그" "이름 :"+ product.getName())Firebase read addValueEventListener onDataChange 값 null

Log.d :

나는 몇 로그 명령이있다;

만 onDataChange 내부의 사람은 나에게 널 포인터 오류를 제공 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

몇 시간 후에 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)는 그 사이에 실행될 것이다.

모든 것은 .. 당신의 GUI는 당신이 당신의 전화를하지만 당신은 귀하의 휴대 전화를 사용하는 데 필요한 반면에 데이터를 수집해야 할 경우 (앱이 충돌처럼) 고정되지 않습니다 있는지 확인하는 일

관련 문제