Android内存优化指南

发布时间:2025-11-27 02:32

鞋柜内部空间优化指南 #生活技巧# #居家生活技巧# #家庭护理技巧# #家居改造方案#

平时用到的优化,也许有遗漏,但是尽量列出来以防生疏,大概都是别重复创建对象,注意对象的回收是影响性能,对象泄漏啊什么的,线程安全的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 手机的终极指南:技巧、窍门和最佳应用

随便看看