【发布时间】:2019-07-04 06:11:13
【问题描述】:
我的应用不包含任何本机代码,但我正在使用以下库:
Fireabse auth,database,storage,messaging
Google Maps, Location
SendGrid - 用于发送电子邮件
RazorPay
Glide
当我的应用程序启动时,Native 部分占用的 RAM 约为 180 MB,在我打开一个从实时数据库读取数据几次的片段后,Native 部分的 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
【问题讨论】:
-
您确定要我们解决您的查询而不获取您的单行代码吗?
-
哪段代码可以帮助解决这个问题?我对此一无所知。我想我会添加我的依赖项和查询实时数据库的方式。
-
您从数据库中读取了多少/哪些数据?您确定 800 mb 内存有问题吗?检查下内存设备(模拟器),看看它是否会导致问题。
-
是的,在低端设备(3 GB RAM 或更少)上,应用程序崩溃并出现 FatalException。无法分配 x 字节。
-
这可能是由于
memory leak导致您的应用程序分配的内存永远不会被释放。您是否在互联网上搜索过“android 内存泄漏”一词(即stackoverflow.com/questions/8174140/android-memory-leak)?
标签: android performance android-studio