2016-11-02 1 views
0

Предварительная информация: Я использую 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()).

+3

Я думал, что, возможно, 'list.size()' запускал какой-то дорогостоящий вызов API, но если 'list' был простым' ArrayList', тогда этого не должно быть. Не могли бы вы также разместить соответствующий Java-код? –

+0

Доступ к этому списку относится к различным темам? –

+0

Список напрямую не обращается к различным темам, он проверяется на разницу в размерах, как указано выше, и если есть разница, она передает последний элемент в списке обработчику.[Это] (http://stackoverflow.com/questions/13189054/implement-falling-pin-animation-on-google-maps-android/20241972#20241972) - метод обработчика, который я использовал. – Gabe

ответ

0

применить этот код в файле Gradle: -

android { 
    dexOptions { 
     javaMaxHeapSize "4g" 
    } 
} 

Я надеюсь, что это поможет.

+0

Не могли бы вы объяснить, почему? – 4castle

+2

Я предполагаю, что вместо увеличения этой большой памяти мы должны сначала попытаться оптимизировать код. –

+0

@ChiragParmar Вы правы! но не видя кода, который мы не можем оптимизировать. поэтому я предлагаю ему увеличить размер кучи, чтобы избежать этой проблемы. – LoveAndroid

1

Я предполагаю, что это связано с тем, что list указывает на некоторую виртуальную структуру, которая фактически не находится непосредственно в памяти вашего приложения.

Следовательно, задействован какой-либо удаленный вызов, который должен получить хотя бы размер списка или, возможно, еще хуже, он запрашивает полный список в другом удаленном приложении и сериализует/десериализует полный список элементов. Благодаря этому и задержке он значительно замедляет ваше первоначальное приложение.

Возможно, вы можете отладить то, что действительно происходит внутри, или, по крайней мере, проверить тип класса, чтобы дать подсказку.

Смежные вопросы