Предварительная информация: Я использую Firebase для хранения базы данных для тех из вас, кто не знает, как это работает: когда объект хранится/удаляется/модифицируется в Firebase (независимо от того, это String, int и т. д.), Firebase отправляет обновленный пакет информации на мобильные устройства, которые прослушивают всю новую информацию. Дело в том, что Firebase не отправляет только новый объект, который был сохранен, он снова отправляет все в этом узле.Установка значений int, вызывающих проблемы с производительностью
История вопроса: Чтобы узнать, было ли что-то добавлено в Firebase, я решил сделать две переменные int. Один называется «oldCount», а один называется «newCount». Они оба установлены в 0 onCreate(). Everytime Firebase послал новый пакет обновления («OnDataChange») я сделал следующее:
«список»oldCount = currentCount;
currentCount = list.size();
является ArrayList, который я создаю из информации, которая посылает Firebase. Если currentCount> oldCount затем были добавлены данные, и я могу продолжить мой код.
Проблема: После добавления этих двух линий увеличилось использование памяти, время между моим устройством и Firebase увеличилось, а простая анимация, которую я не работал, мой поток пропускал около 200 кадров. Это звучит смешно, но после удаления этих двух строк все работает нормально, память ОК, никакие кадры не пропускаются. Я планирую искать другой способ проверить, были ли данные добавлены, но я просто нашел эту ошибку настолько странной, я надеялся, что кто-то может пролить свет на то, что происходит.
Соответствующий код:
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
private GoogleMap mMap;
private boolean mapReady = false;
private boolean firstLoad = true;
private int loadCount;
private ArrayList<> list;
private DatabaseReference Reference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
list = new ArrayList<>();
loadCount = 0;
setUpData();
private void setUpData() {
Query query = openTicketsReference.orderByChild("variableX").equalTo("variableY");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
listOfInspections = new ArrayList<>();
for (DataSnapshot ref : dataSnapshot.getChildren()) {
//get data and add to arraylist here
}
loadCount++; //see how many times data has been retrieved from server
}
setUpMarkers();
}
private void setUpMarkers() {
if(loadCount<2){
Log.v("loadCount<2",""+loadCount);
//do things for first data retrieval
}
else if (loadcount>1){
Log.v("loadCount>1",""+loadCount);
//do things for subsequent retrievals
}
}
}
Что я вижу в этих журналах в конце концов, это немного запутанным тоже:
(Это после добавления данных в firebase)
V/loadCount>1: 33
V/loadCount>1: 11
V/loadCount>1: 8
V/loadCount>1: 34
V/loadCount>1: 34
V/loadCount>1: 12
V/loadCount>1: 9
V/loadCount>1: 35
V/loadCount>1: 35
V/loadCount>1: 13
V/loadCount>1: 10
V/loadCount>1: 36
V/loadCount>1: 36
V/loadCount>1: 14
V/loadCount>1: 11
Они никогда не должны уменьшаться, поскольку я никогда не вычитаю из переменной, а только добавляю (после установки на 0 onCreate()).
Я думал, что, возможно, 'list.size()' запускал какой-то дорогостоящий вызов API, но если 'list' был простым' ArrayList', тогда этого не должно быть. Не могли бы вы также разместить соответствующий Java-код? –
Доступ к этому списку относится к различным темам? –
Список напрямую не обращается к различным темам, он проверяется на разницу в размерах, как указано выше, и если есть разница, она передает последний элемент в списке обработчику.[Это] (http://stackoverflow.com/questions/13189054/implement-falling-pin-animation-on-google-maps-android/20241972#20241972) - метод обработчика, который я использовал. – Gabe