为什么从主方法登录时,我的ArrayList大小显示为零,而从内部方法调用时,为什么显示一定数目的大小?

时间:2019-01-28 04:08:38

标签: java android firebase arraylist

我正在使用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

3 个答案:

答案 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

所以现在它具有值了。