我正在使用firebase创建一个自动售货机程序,其中每次在firebase中更新值时,它将被提取到类“ NewUt”并将其添加到ArrayList“ allLocations”。onCreate方法中具有Log.d()当数据更新时,它会在onDataChange方法中打印数组的大小和另一个Log.d()。 onCreate中的Log.d()显示该数组的大小为0,但onDataChange方法中的Log.d()显示的大小大于零。可能是什么问题?
我尝试将onDataChange放入其他方法中,但结果仍然相同。
package com.xeon.vendingmachine;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.Camera;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.firebase.FirebaseApp;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class MapsActivity extends FragmentActivity implements
OnMapReadyCallback {
private GoogleMap mMap;
DatabaseReference myRef;
private static ArrayList<Utilities> allLocations = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
FirebaseApp.initializeApp(this);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
myRef = FirebaseDatabase.getInstance().getReference("Vending Machines");
Random r = new Random();
Double randLat = r.nextDouble()*100;
Double randLon = r.nextDouble()*100;
Utilities utilitiesForDatabase = new Utilities(randLat,randLon,"Carol Machifne","Carfol","Layfs","Ffull");
String uid = myRef.push().getKey();
myRef.child(uid).setValue(utilitiesForDatabase);
String TAG = "RefFromMain";
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
allLocations.clear();
for (DataSnapshot allLocs : dataSnapshot.getChildren()) {
Utilities newUt = allLocs.getValue(Utilities.class);
allLocations.add(newUt);
}
Log.d("ArraySize" , "Size is " + allLocations.size());
Log.d("LatLng" , " New Lattitude : " + allLocations.get(allLocations.size()-1).getLattitude() + " Longitude : " + allLocations.get(allLocations.size()-1).getLongitude());
NotificationCompat.Builder mBuilderArray =
new NotificationCompat.Builder(getApplicationContext())
.setContentTitle("New location added")
.setSmallIcon(R.drawable.common_google_signin_btn_icon_dark)
.setContentText("Size is " + allLocations.size());
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1,mBuilderArray.build());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.e("Database Error", "The data could not be extracted");
}
});
Log.d(TAG , "Size is " + this.allLocations.size());
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
}
}
onCreate方法中的Log.d()。
D/RefFromMain: Size is 0
D/RefFromMain: Size is 0
D/RefFromMain: Size is 0
D/RefFromMain: Size is 0
onDataChange方法中的Log.d()。
D/ArraySize: Size is 4
D/ArraySize: Size is 5
D/ArraySize: Size is 6
D/ArraySize: Size is 10
答案 0 :(得分:4)
allLocations = new ArrayList<>();
Log.d(TAG , "Size is " + allLocations.size());
里面什么都没有。因此,其大小为零。
稍后您将一些东西放进去:
allLocations.add(newUt);
}
Log.d("ArraySize" , "Size is " + allLocations.size());
现在它的大小增加了(根据紧随其前的for循环增加了一些元素)
答案 1 :(得分:2)
分配后,您在main中记录了阵列大小。所以它是0。
但是在onDataChange
中,您已经使用allLocations.add(newUt);
将数据放入该数组中。因此显示的大小等于插入其中的数据数量。
答案 2 :(得分:0)
首先,您正在初始化Arraylist。这里
0000000100bb014c
因此它以空数据初始化。里面什么都没有。之后,在0x11056246d
中将数据添加到 allLocations = new ArrayList<>();
Log.d(TAG , "Size is " + allLocations.size());
ArrayList中。
addValueEventListener
所以现在它具有值了。