盛年不重来,一日难再晨,及时当勉励,岁月不待人。这篇文章主要讲述安卓常见引起内存泄漏的五种情况相关的知识,希望能为你提供帮助。
1,单例引起的内存泄漏----解决办法 将context生命周期和application保持一致
public class SingletonAppliationContext {
private static SingletonAppliationContext instance;
private Context context;
private SingletonAppliationContext(Context context) {
this.context = context.getApplicationContext();
// 使用Application 的context
}
public static SingletonAppliationContext getInstance(Context context) {
if (instance == null) {
instance = new SingletonAppliationContext(context);
}
return instance;
}
}
2.非静态内部类创建静态实例造成的内存泄漏 解决办法将内部类noneStaticClass 设置为static
public class StaticLeakActivity extends Activity {
private static noneStaticClass mResource = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (mResource == null) {
mResource = new noneStaticClass();
}
}
private static class noneStaticClass {
}
}
3.handler造成内存泄漏 handler、Message、MessageQueue
TLS(生命周期不一致)
https://blog.csdn.net/u010134087/article/details/53610654
/**
* 解决办法:
* 1.将 Handler 声明为静态的
* 2.通过弱引用的方式引入 Activity
*/
public class SampleActivity extends Activity {
/**
* Instances of static inner classes do not hold an implicit
* reference to their outer class.
*/
private static class MyHandler extends Handler {
private final WeakReference<
SampleActivity>
mActivity;
public MyHandler(SampleActivity activity) {
mActivity = new WeakReference<
SampleActivity>
(activity);
}
@Override
public void handleMessage(Message msg) {
SampleActivity activity = mActivity.get();
if (activity != null) {
// ...
}
}
}
private final MyHandler mHandler = new MyHandler(this);
/**
* Instances of anonymous classes do not hold an implicit
* reference to their outer class when they are "static".
*/
private static final Runnable sRunnable = new Runnable() {
@Override
public void run() { /* ... */ }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Post a message and delay its execution for 10 minutes.
mHandler.postDelayed(sRunnable, 1000 * 60 * 10);
// Go back to the previous Activity.
finish();
}
}
4,线程造成的内存泄漏 解决办法
/**
* 解决办法:
* 1.将 MyAsyncTask
MyRunnable
声明为静态的
* 2.通过弱引用的方式引入 Activity
*/
5.Webview造成的内存泄漏
public class WebviewLeakActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.wv_show);
mWebView.loadUrl("http://www.baidu.com");
}
// 解决办法
@Override
protected void onDestroy() {
destroyWebView();
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
}
private void destroyWebView() {
if (mWebView != null) {
mWebView.pauseTimers();
mWebView.removeAllViews();
mWebView.destroy();
mWebView = null;
}
}
}
【安卓常见引起内存泄漏的五种情况】
推荐阅读
- 安卓基础干货(安卓测试以及解析)
- Android和iPhone的最佳表情符号键盘应用软件推荐合集
- Win10系统uefi打开办法
- Win10下键盘打字出现重复该怎样办?
- Win10系统cortana无法连接网络怎样处理?
- Win10系统如何让任务栏自动切换颜色
- Win10驱动 如何迅速安装驱动?
- 3星笔记本怎样重装win10系统
- Win10系统玩lol游戏黑屏怎样办?