如何重写这些Firebase ValueEventListener是否可读?

时间:2017-01-03 17:35:59

标签: android firebase firebase-realtime-database

如果有什么我正在努力解决这个问题,那么如何通过异步调用Firebase来编写外观漂亮的代码。以下是我的一个功能的代码,该功能从Firebase检索所有用户和当前用户,并检查他们所选位置之间的距离。

我无法将每个private void getUsersToDisplay() { // Get users to display from firebase Log.w(TAG, "User fetch initialized"); DatabaseReference currentUserRef = mDatabase.getReference().child("users/" + mCurrentUser.getUid()); // Get current user from firebase currentUserRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot currentUserSnapshot) { // Get the users chosen location for use in distance calculation final Double currentUserChosenLatitude = Double.parseDouble(currentUserSnapshot.child("chosen_location/latlng/latitude").getValue().toString()); final Double currentUserChosenLongitude = Double.parseDouble(currentUserSnapshot.child("chosen_location/latlng/longitude").getValue().toString()); DatabaseReference usersRef = mDatabase.getReference().child("users"); // Get all users from firebase usersRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot allUsersSnapshot) { // For all users in firebase for (DataSnapshot userSnap : allUsersSnapshot.getChildren()) { String userId = userSnap.getKey(); DatabaseReference userRef = mDatabase.getReference().child("users/" + userId); // If the user isn't the current user if (!userId.equals(mCurrentUser.getUid())) { // Get the user's info from firebase userRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot userSnapshot) { Double userChosenLatitude = Double.parseDouble(userSnapshot.child("chosen_location/latlng/latitude").getValue().toString()); Double userChosenLongitude = Double.parseDouble(userSnapshot.child("chosen_location/latlng/longitude").getValue().toString()); float[] results = new float[1]; Location.distanceBetween( currentUserChosenLatitude, currentUserChosenLongitude, userChosenLatitude, userChosenLongitude, results); // If the user is within 10km of the current user, display it if (results[0] < 10000) { users.put(userSnapshot.getKey(), (String) userSnapshot.child("first_name").getValue()); mUserAdapter.add((String) userSnapshot.child("first_name").getValue()); Log.w(TAG, "User to display fetch complete"); } } @Override public void onCancelled(DatabaseError databaseError) { Log.w(TAG, "User to display fetch cancelled"); } }); } } Log.w(TAG, "Users fetch completed"); } @Override public void onCancelled(DatabaseError databaseError) { Log.w(TAG, "Users fetch cancelled"); } }); Log.w(TAG, "Current user fetch complete"); } @Override public void onCancelled(DatabaseError databaseError) { Log.w(TAG, "Current user fetch cancelled"); } }); } 移动到单独的函数中,因为它们都必须连续触发。

如何让这段代码看起来不错?

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteRule ^scategory/(.*)  http://www.truckeeriverrock.com/$1 [R=301,L]
RewriteRule ^whosonline/(.*)  http://www.truckeeriverrock.com/$1 [R=301,L]
RewriteRule ^admintools/(.*)  http://www.truckeeriverrock.com/$1 [R=301,L]]
</IfModule>

# END WordPress

1 个答案:

答案 0 :(得分:1)

我像这样编写代码,因此更容易阅读:

object[prop] = object[prop].map(xss)

如果我想要在另一个Firebase调用之后运行Firebase调用,请将其放在onCreate() { dataRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { doSomething(dataSnapshot); ... } ... } } doSomething(DataSnapshot dataSnapshot) { ... } 内。

但是,如果该调用不必相继运行(例如“获取当前用户”和“从示例代码中获取所有用户”),我就这样做了:

doSomething

希望得到这个帮助。