在Android开发中,内存泄漏是导致应用崩溃的常见问题之一。下面是一个示例代码,展示了一种潜在的导致内存泄漏的情况,并提供了解决方法。
示例代码:
public class MainActivity extends AppCompatActivity {
private static List dataList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 模拟数据添加
for (int i = 0; i < 100000; i++) {
Data data = new Data();
dataList.add(data);
}
// 模拟内存泄漏情况
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do something
}
});
}
}
在这个示例中,我们创建了一个包含大量数据的List,并在点击按钮时执行一些操作。由于Button的点击监听器是匿名内部类,它持有MainActivity的引用,这可能导致MainActivity无法被垃圾回收,从而造成内存泄漏。
解决方法:
public class MainActivity extends AppCompatActivity {
private static List dataList = new ArrayList<>();
// ...
private static class ButtonClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// Do something
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ...
Button button = findViewById(R.id.button);
button.setOnClickListener(new ButtonClickListener());
}
}
public class MainActivity extends AppCompatActivity {
private static List dataList = new ArrayList<>();
private WeakReference buttonClickListenerRef;
// ...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ...
buttonClickListenerRef = new WeakReference<>(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do something
}
});
Button button = findViewById(R.id.button);
button.setOnClickListener(buttonClickListenerRef.get());
}
}
通过使用静态内部类或弱引用,我们可以避免匿名内部类持有外部类的引用,从而解决这种潜在的导致应用崩溃的内存泄漏问题。
下一篇:android内存监控