我正在使用Eclipse中的MAT学习内存利用率.虽然我遇到了一个奇怪的问题.抛开沉重的应用程序,我开始使用最温和的"Hello World"应用程序.这就是我在Nexus 5,ART运行时,Lollipop 5.0.1上获得的Heap Stats .
ID:1
堆大小:25.429 MB
分配:15.257 MB
免费:10.172 MB
%使用:60%
#Objects:43487
我的堆转储给了我3个内存泄漏嫌疑人:概述
"由于声誉低,不能发布饼图."
问题可疑1
由""加载的类"android.content.res.Resources"占用10,166,936(38.00%)个字节.内存累积在由""加载的"android.util.LongSparseArray []"的一个实例中.
关键字android.util.LongSparseArray [] android.content.res.Resources
问题可疑2
"android.graphics.NinePatch"的209个实例,由""加载占用5,679,088(21.22%)个字节.这些实例是从"java.lang.Object []"的一个实例引用的,由""关键字java.lang.Object [] android.graphics.NinePatch加载
问题可疑3
"java.lang.reflect.ArtMethod []"的8个实例,由""加载占用3,630,376(13.57%)个字节.最大的实例:•java.lang.reflect.ArtMethod [62114] @ 0x70b19178 - 1,888,776(7.06%)字节.•java.lang.reflect.ArtMethod [21798] @ 0x706f5a78 - 782,800(2.93%)个字节.•java.lang.reflect.ArtMethod [24079] @ 0x70a9db88 - 546,976(2.04%)字节.关键字java.lang.reflect.ArtMethod []
这只是一个简单的代码:
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
Run Code Online (Sandbox Code Playgroud)
}
问题
heap memory-leaks memory-management heap-memory android-5.0-lollipop
我知道你很想把它标记为重复但等等,让我再次通过我的详细(但失败)尝试再次讨论这个问题.
策略1:算法: 答案
第一次触发onChange时,更新行的id
下次再次触发onChange时,会更新行的id
匹配id
忽略相同的id
这种方法的问题在于它很容易受到竞争条件的影响.如果在获得更新行的id时,onChange 第二次触发,则此算法失败.这源于我在慢速机器或以峰值容量工作的机器上进行测试时的个人经验.
策略2:算法:答案
覆盖deliverSelfNotifications()以返回true.
这看起来很有希望,但没有奏效.我用来参考的代码:
在主要活动:OnCreate方法我注册:
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new CtObserver(new Handler()));
Run Code Online (Sandbox Code Playgroud)
然后在一个单独的类中:
package com.example.testproject;
import android.database.ContentObserver;
import android.os.Handler;
import android.util.Log;
/**
* @author Time Traveller
*/
public class CtObserver extends ContentObserver {
public CtObserver(Handler handler) {
super(handler);
}
public boolean deliverSelfNotifications(){
return true;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.e("onChange","Fired");
}
}
Run Code Online (Sandbox Code Playgroud)
为什么您应该为此答案做出贡献:
Quering SMS content Provider是非默认应用程序捕获已发送SMS事件的唯一方法.但到目前为止,我还没有找到任何令人信服的完整功能的答案.所以我们真的需要对此有所了解!! …
sms android onchange android-contentprovider contentobserver