Мое приложение для Android использует слишком много ОЗУ (0,8 ГБ) в разделе «Нативный». Как уменьшить это? - PullRequest
0 голосов
/ 04 июля 2019

Мое приложение не содержит собственного кода, но я использую следующие библиотеки:

Fireabse auth * database 1005 * messaging

Google Maps, Location

SendGrid - для отправки писем

RazorPay

Glide

Когда мое приложение запускается, объем ОЗУ, занятый Native, составляет около 180 МБ , и после того, как я открываю фрагмент, который пару раз считывает данные из базы данных реального времени, использование ОЗУ разделом Native снимает до 800 МБ !

Как я могу уменьшить это?

Редактировать:

Мои зависимости

implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.google.firebase:firebase-auth:16.1.0'
    implementation 'com.google.firebase:firebase-database:16.0.6'
    implementation 'com.google.firebase:firebase-storage:16.0.4'
    implementation 'com.google.firebase:firebase-messaging:17.3.4'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.google.android.gms:play-services-auth:16.0.1'
    implementation 'com.google.android.gms:play-services-maps:16.1.0'
    implementation 'com.google.android.gms:play-services-location:16.0.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
    implementation 'com.payumoney.sdkui:plug-n-play:1.5.0'
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.razorpay:checkout:1.4.5'
    implementation files('libs/sendgrid-0.1.2-jar.jar')
    implementation 'com.github.bumptech.glide:glide:4.9.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
    implementation 'com.github.mklimek:frame-video-view:1.3.3'

Вот как я запрашиваю данные из базы данных

DatabaseReference carReference = FirebaseDatabase.getInstance().getReference();
        carReference.child("carDetails").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                ArrayList<String> carsOwnedByUser = new ArrayList<>();
                for (DataSnapshot carDetails : dataSnapshot.getChildren()) {
                    CarDetails car = carDetails.getValue(CarDetails.class);

                    if (userId.equals(car.getUserId())) {
                        carsOwnedByUser.add(car.getMake());
                    }
                }

                String selectedCar = sharedPreferences.getString(Constants.SHARED_PREFERENCES_SELECTED_CAR, "None");

                if (carsOwnedByUser.size() > 0) {
                    if (selectedCar.equals("None")) {
                        SharedPreferences.Editor editor = sharedPreferences.edit();
                        editor.putString(Constants.SHARED_PREFERENCES_SELECTED_CAR, carsOwnedByUser.get(0));
                        editor.apply();
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

Что я пробовал:

Я попытался отключить кеширование диска в Glide и попытался установить для DatabaseReferenec.getInstance (). SetPersistacneEnabled () и keepSynced () значение false, но они не помогли.

Редактировать 2:

Я проверил дамп кучи в профилировщике и увидел, что Bitmap занимает 300 МБ в собственном разделе

Изображение

1 Ответ

0 голосов
/ 04 июля 2019

Прежде всего, нижняя строка является основной причиной высокого использования памяти.

carReference.child("carDetails"). addListenerForSingleValueEvent(...)

Выше строки загружают все дочерние элементы carDetails из базы данных firebase в память устройства.Поэтому избегайте этого.Если вам все еще нужно это использовать, разбейте данные на страницы, используя правильную комбинацию фильтров запросов startAt(), endAt(), limitToFirst() и limitToLast(). Документация

Если вы все еще не можете сделать правильную нумерацию страниц, тогда используйте правильную структуру базы данных, чтобы вы могли получить необходимые данные с помощью простого запроса. Рекомендации по структуре данных

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