Android内存优化指南
鞋柜内部空间优化指南 #生活技巧# #居家生活技巧# #家庭护理技巧# #家居改造方案#
平时用到的优化,也许有遗漏,但是尽量列出来以防生疏,大概都是别重复创建对象,注意对象的回收是影响性能,对象泄漏啊什么的,线程安全的java 类,还需要注意代码可读性,可读性才提供给他人修改你的代码可能。推荐实时监测工具Leaks、如果对局部重复检查,还需要结合开发工具自带的内存泄漏检查
1、Bitmap使用时候,不要马上收回了,因为对象引用还存在,而且界面还未注销,还重复使用的,但忘记在哪个版本后就无需这样做了

2、Bitmap 对象清空时候,最好先调用recycle(),虽然做内存泄漏检测时候,发现对象已经不存在,但是recycle进行C层面回收,在哪个版本开始就不需要手动注销了。
3、Handler 使用,有避免内存泄漏情况,因为它是队列形式,而持有当前Activity对象,网上有资料,例子用法
public Handler handler = new MyHandler(this);
static class MyHandler extends Handler {
final WeakReference<BaseActivity> mActivityReference;
MyHandler(BaseActivity activity) {
mActivityReference = new WeakReference<BaseActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
final BaseActivity activity = mActivityReference.get();
if (activity != null || !activity.isdestroy) {
activity.handleMessage(msg);
}
}
}
java
运行
4、Handler 也要回收
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);
handler = null;
}
java
运行
5、别把当前的Context 传到初始化单例中去,因为单例对象周期和你的Context周期不一样,这样就容易导致泄漏,Context可以使用getApplicationContext()
public class AppManager {
private static AppManager instance;
private Context context;
private AppManager(Context context) {
this.context = context;
}
public static AppManager getInstance(Context context) {
if (instance == null) {
instance = new AppManager(context);
}
return instance;
}
}
java
运行
6、匿名内部类的使用,特别是周期比较长的,如线程方面的
Runnable runnable = new Runnable() {
@Override
public void run() {
}
};
java
运行
可以这样试试
Runnable runnable = new TestRunnable();
static class TestRunnable implements Runnable {
@Override
public void run() {
}
}
java
运行
7、做了某些监听,如果是add类型的,建议用完都remove掉
getWindow().getDecorView().post(new Runnable() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
Message msg = handler.obtainMessage(0);
msg.obj = "333";
handler.sendMessage(msg);
}
});
getWindow().getDecorView().removeCallbacks(this);
}
});
java
运行
8、一些View,建议别用static ,这样全局以后,Context就无法回收
private static final class ViewHolder {
private static ImageView mPhotoView;
private static TextView mCounter;
}
java
运行
9.SharedPreference 不能滥用
解析sp的时候会产生大量的临时对象,导致频繁GC,引起界面卡顿。这些key和value会永远存在于内存之中,占用大量内存。下面是默认的sp实现SharedPreferenceImpl这个类的getString函数:
public String getString(String key, @Nullable String defValue) {
synchronized (this) {
awaitLoadedLocked();
String v = (String)mMap.get(key);
return v != null ? v : defValue;
}
}
java
运行
继续看看这个awaitLoadedLocked:
private void awaitLoadedLocked() {
while (!mLoaded) {
try {
wait();
} catch (InterruptedException unused) {
}
}
}
js
一把锁就是挂在那里!!这意味着,如果你直接调用getString,主线程会等待加载sp的那么线程加载完毕!这不就把主线程卡住了么?
网址:Android内存优化指南 https://www.yuejiaxmz.com/news/view/1410792
相关内容
Android性能优化:这是一份全面 & 详细的性能优化指南(含内存优化、布局优化等)旧款Android设备升级指南:优化性能与兼容性的编程技巧
Android系统优化
android 内存压力测试工具
Android应用性能优化
android native内存分析工具,Android内存分析工具 — Memory Profiler
告别繁琐,Android系统深度优化指南:解锁高效智能生活
Android游戏空间优化技巧:提升性能与存储管理的编程实践
揭秘手机翻新:Android设备焕新攻略与选购指南
加速和优化 Android 手机的终极指南:技巧、窍门和最佳应用

