我的Android应用在“本机”部分使用了过多的RAM(0.8 GB)。如何减少呢?

时间:2019-07-04 06:11:13

标签: android performance android-studio

我的应用程序不包含任何本地代码,但是我正在使用以下库:

Fireabse authdatabasestoragemessaging

Google MapsLocation

SendGrid-用于发送电子邮件

RazorPay

Glide

当我的应用启动时,“本机”部分占用的RAM大约为 180 MB ,并且在我打开一个片段从实时数据库中读取数据几次后,本机的RAM使用情况部分最多拍摄 800 MB

如何减少这种情况?

修改:

我的依赖项

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 MB

Image

1 个答案:

答案 0 :(得分:0)

首先,下面的行是内存使用率高的主要原因。

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

在上述行中,将所有carDetails的子级从firebase数据库加载到设备的内存中。所以避免使用它。如果您仍然需要使用它,则使用startAt()endAt()limitToFirst()limitToLast()查询过滤器的适当组合对数据进行分页。 Documentation

如果仍然无法进行正确的分页,请继续使用正确的数据库结构,以便可以使用简单的查询获取所需的详细信息。 Best Practices for data structure