2017-03-17 30 views
0

我的Firebase eventListeners有问题。我正尝试从Firebase数据库获取一些数据,但我无法获得结果。问题是,我的听众没有运行或返回结果。我试着用2个不同的监听器获取结果(onGetDataListener,ValueEventListener)。在调试过程中,整个侦听器被跳过,调试器向前移动。我已经在所有侦听器阶段添加了Log.d,但没有任何访问。未输入EventListeners

public class Suggestionsfragment extends Fragment implements AdapterView.OnItemClickListener { 
    private GooglePlaceList nearby; 
    LinearLayout linearLayout; 
    Double latitude; 
    Double longitude; 
    List<String> urlList; 
    private List<String> interestList; 
    private List<Double> latlong; 


    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.suggestions, container, false); 
     linearLayout = (LinearLayout) v.findViewById(R.id.main_layout); 

     String placesKey = this.getResources().getString(R.string.places_key); 
     interestList = new ArrayList<>(); 
     latlong = new ArrayList<>(); 
     nearby = null; 
     FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(); 
     FirebaseUser user = firebaseAuth.getCurrentUser(); 
     DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference(); 
     if (user != null) { 

      DatabaseReference ref1 = databaseReference.child(user.getUid()).child("interest"); 
      readData(ref1, new OnGetDataListener() { 
       @Override 
       public void onSuccess(DataSnapshot dataSnapshot) { 
        Log.d("ONSUCCESS", "Success"); 
        for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
         String interests = postSnapshot.getValue(String.class); 
         interestList.add(interests); 
        } 
       } 
       @Override 
       public void onStart() { 
        //whatever you need to do onStart 
        Log.d("ONSTART", "Started"); 
       } 

       @Override 
       public void onFailure() { 
       Log.d("ONFAILURE", "Failure"); 
       } 
      }); 
      databaseReference.child(user.getUid()); 
      databaseReference.child("location"); 
      databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        Log.d("ONDATACHANGED", "listener2 entered"); 
        try { 
         if (dataSnapshot.getValue() != null) { 
          for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
           Double loc = postSnapshot.getValue(Double.class); 
           latlong.add(loc); 
          } 

         } 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
     } 
     latitude = latlong.get(0); 
     longitude = latlong.get(1); 

     int radius = 500; 
     urlList = generateUrlList(interestList, longitude, latitude, radius, placesKey); 
     if (placesKey.equals("PUT YOUR KEY HERE")) 
      Toast.makeText(getActivity(), "You haven't entered your Google Places Key into the strings file. Dont forget to set a referer too.", Toast.LENGTH_LONG).show(); 
     else { 
      PlacesReadFeed process = new PlacesReadFeed(); 
      process.execute(urlList); 

     } 

     return v; 
    } 
    ... 
} 

回答

0

我设法与异步工作通过建立我的onDataChanged内应用火力取:

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.suggestions, container, false); 
    linearLayout = (LinearLayout) v.findViewById(R.id.main_layout); 

    final String placesKey = this.getResources().getString(R.string.places_key); 
    interestList = new ArrayList<>(); 
    latlong = new ArrayList<>(); 
    nearby = null; 
    FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(); 
    FirebaseUser user = firebaseAuth.getCurrentUser(); 

    if (user != null) { 
     DatabaseReference ref1 = FirebaseDatabase.getInstance().getReference().child(user.getUid()); 
     readData(ref1, new OnGetDataListener() { 
      @Override 
      public void onSuccess(DataSnapshot dataSnapshot) { 
       Log.d("ONSUCCESS", "Success"); 
       for (DataSnapshot postSnapshot : dataSnapshot.child("interest").getChildren()) { 
        String interests = postSnapshot.getValue(String.class); 
        interestList.add(interests); 
       } 
       for (DataSnapshot postSnapshot : dataSnapshot.child("location").getChildren()) { 
        Double loc = postSnapshot.getValue(Double.class); 
        latlong.add(loc); 
       } 

       latitude = latlong.get(0); 
       longitude = latlong.get(1); 

       int radius = 500; 
       urlList = generateUrlList(interestList, longitude, latitude, radius, placesKey); 
       PlacesReadFeed process = new PlacesReadFeed(); 
       process.execute(urlList); 
      } 

      @Override 
      public void onStart() { 
       //Whatever you want to do on start 
       Log.d("ONSTART", "Started"); 
      } 

      @Override 
      public void onFailure() { 
       //Whatever you want to do in case of failure 
       Log.d("ONFAILURE", "Failure"); 
      } 
     }); 
    } 

    return v; 
} 

的READDATA和OnGetListener接口:

public void readData(DatabaseReference ref, final OnGetDataListener listener) { 
    listener.onStart(); 
    ref.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      listener.onSuccess(dataSnapshot); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      listener.onFailure(); 
     } 
    }); 

} 

interface OnGetDataListener { 
    //make new interface for call back 
    void onSuccess(DataSnapshot dataSnapshot); 
    void onStart(); 
    void onFailure(); 
} 
1

有很多事情要解决。

此代码是不正确的:

databaseReference.child(user.getUid()); // does nothing 
databaseReference.child("location"); // does nothing 
databaseReference.addListenerForSingleValueEvent(...); 

你可能想:

databaseReference.child(user.getUid()).child("location") 
    .addListenerForSingleValueEvent(...); 

你说在调试整个听众越来越跳过,调试器前进。这是因为在将查询发送到Firebase服务器并收到响应之后,侦听器回调将异步触发(更多详细信息,请参阅here)。这意味着,当这些语句执行:因为onDataChange()尚未执行

latitude = latlong.get(0); 
longitude = latlong.get(1); 

latlong将不包含有效数据。

如果您的听众不会触发,则可能是您没有互联网连接,或者安全规则未设置为允许读取数据。安全规则解释为here。你应该调试输出添加到onCancelled()

@Override 
public void onCancelled(DatabaseError databaseError) { 
    Log.e("CANCELLED", databaseError.toException()); 
} 

我不认识OnGetDataListener()。这是你定义的类吗?

+0

我曾经有过datareference为你指示没有结果:databaseReference.child(user.getUid())。child(“location”) .addListenerForSingleValueEvent(...); 我已经找到了onGetDataListener从这个帖子: http://stackoverflow.com/questions/42621911/firebase-ondatachange-not-entered 这似乎与我的问题,但它并没有黯然帮助。 –

+0

你说得对,异步监听器回调可能是问题。我已经注释了可能导致空指针的变量,并且onDataChanged在执行后运行3秒。我想我需要找出一种在代码执行之前检索Firebase数据的方法。 –