【发布时间】:2015-08-18 04:29:15
【问题描述】:
我有一个非常需要内存的应用程序,这真的不是我想要的。平均而言,它位于 90Mb 和 120Mb 之间。这很奇怪,因为前几天晚上它只占用了 40Mb 左右,这显然是可以接受的。 当我简单地运行应用程序时,我的第一个问题就出现了。第二个问题是当我滚动浏览我的 ListView 时,我可以看到内存一次被大块填满。 SOoo 现在我正在寻找内存泄漏。 我从带有新的 Android Studio 功能/按钮“Dump Java Heap”的堆转储开始。 因此,在显示堆转储的所有内容时,我不时注意到非常大的数字,尤其是在涉及 LinkedHashMaps 和 HashMaps 时。
对于应用程序在进入 ListView 之前所做的工作量,它实际上不应该已经使用了那么多内存(我相信),除非它是我怀疑的每个应用程序的标准配置。
看这张图,我怎么知道哪个是真正的内存泄漏,从这里开始如何找到它们?
好的,我将在 ListView 显示之前插入前 2 个调用的函数。
请记住,我所有的图片都是从内部存储加载毕加索的,因为它非常快,我也切换了内存缓存。
此函数准备适配器并发送 objectID,以便新 Intent 可以自行从 SQLite DB 中获取数据。
public void DisplayList(final List<ListData> DL)
{
ListAdapter listAdapter = new ParseAdapter(this,DL);
ListView listView = (ListView) findViewById(R.id.Parse_list);
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
String food = String.valueOf(parent.getItemAtPosition(position));
//setContentView(R.layout.deal_showcase);
Intent i = new Intent(getApplicationContext(),Deal_Showcase.class);
i.putExtra("objectid",DL.get(position).getObjectID());
//Intent intent = new Intent(this,DL.class);
startActivity(i);
}
}
);
}
//Adapter class
public class ParseAdapter extends ArrayAdapter<ListData>
{
ParseAdapter(Context context, List<ListData> adapResource) {
super(context, R.layout.parse_list_layout, adapResource);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
View customView = layoutInflater.inflate(R.layout.parse_list_layout, parent, false);
//PLease note that after implementing a ViewHolder is did not really do anything for me
//Also the ViewHolder implementation is not here at the moment but this is the version of //the code right before the ViewHolder got implemented.
String singleItem = getItem(position).getName();
TextView rText = (TextView) customView.findViewById(R.id.pName);
TextView yText = (TextView) customView.findViewById(R.id.pDistance);
ImageView image = (ImageView) customView.findViewById(R.id.imageView);
rText.setText(getItem(position).getName());
yText.setText(Integer.toString(getItem(position).getDistance()));
Picasso.with(this.getContext()).load("file://"+getItem(position).getArt_work_uri())
.resize(200,200)
.into(image);
return customView;
}
}
代码编辑 1:
public class ParseAdapter extends ArrayAdapter<DealListData>
{
//Inner static class ViewHolder
static class ViewHolder
{
TextView Distance;
TextView DealName;
ImageView image;
}
ParseAdapter(Context context, List<DealListData> adapResource) {
super(context, R.layout.parse_list_layout, adapResource);
}
View convertView;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView==null)
{
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
convertView = layoutInflater.inflate(R.layout.parse_list_layout, parent, false);
//ViewHolder holder setup
holder = new ViewHolder();
holder.DealName = (TextView) convertView.findViewById(R.id.pName);
holder.Distance = (TextView) convertView.findViewById(R.id.pDistance);
holder.image = (ImageView) convertView.findViewById(R.id.imageView);
//Store the holder in the view
convertView.setTag(holder);
}
else
{
//Get the holder if it already exists
holder = (ViewHolder) convertView.getTag();
}
customView.findViewById(R.id.imageView);
holder.DealName.setText(getItem(position).getName());
holder.Distance.setText(Integer.toString(getItem(position).getDistance()));
Picasso.with(this.getContext()).load("file://"+getItem(position).getArt_work_uri())
//.memoryPolicy(MemoryPolicy.NO_CACHE )
.networkPolicy(NetworkPolicy.NO_CACHE)
.resize(200,200)
.into(holder.image);
return convertView;
}
}
【问题讨论】:
-
在 Eclipse 中,您有一个名为“泄漏嫌疑人”的按钮,它可能也在 android studio 中,这说明了什么?
-
我会尽快调查的!
-
在下面查看我的答案。我想我找到了你的问题。
-
@JohanShogun 我不确定您是否指的是 Dump heap 按钮下方的“开始分配跟踪”按钮。问题是只有 3 个按钮。另一个是垃圾收集器按钮。
-
vogella.com/tutorials/EclipseMemoryAnalyzer/article.html 如果你在 android studio 中没有类似的东西,你可以在 eclipse 中打开 head dump 文件。
标签: java android memory-management memory-leaks