蜂窝后,谷歌表示,位图是由堆(谈到管理在这里 ),所以如果一个位图不再是可访问的,我们可以假设,GC照顾它并释放它。
我想创造一个演示,显示的为ListView讲座(从显示的想法效率在这里 ),所以我做了一个小的应用程序。 该应用程序允许用户按一个按钮,然后在列表视图滚动一路底部,而它有10000项,其中的内容是android.R.drawable项目(姓名和图像)。
出于某种原因,我得到了内存,即使我不保存任何图像,所以我的问题是:这怎么可能? 它是什么,我失踪?
我测试过上的Galaxy S III的应用程序,但我不断收到内存不足异常,如果我使用适配器的原生版本。 我不明白为什么这样的情况,因为我不存储任何。
下面的代码:
public class MainActivity extends Activity
{
private static final int LISTVIEW_ITEMS =10000;
long _startTime;
boolean _isMeasuring =false;
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listView=(ListView)findViewById(R.id.listView);
final Field[] fields=android.R.drawable.class.getFields();
final LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// listen to scroll events , so that we publish the time only when scrolled to the bottom:
listView.setOnScrollListener(new OnScrollListener()
{
@Override
public void onScrollStateChanged(final AbsListView view,final int scrollState)
{
if(!_isMeasuring||view.getLastVisiblePosition()!=view.getCount()-1||scrollState!=OnScrollListener.SCROLL_STATE_IDLE)
return;
final long stopTime=System.currentTimeMillis();
final long scrollingTime=stopTime-_startTime;
Toast.makeText(MainActivity.this,"time taken to scroll to bottom:"+scrollingTime,Toast.LENGTH_SHORT).show();
_isMeasuring=false;
}
@Override
public void onScroll(final AbsListView view,final int firstVisibleItem,final int visibleItemCount,final int totalItemCount)
{}
});
// button click handling (start measuring) :
findViewById(R.id.button).setOnClickListener(new OnClickListener()
{
@Override
public void onClick(final View v)
{
if(_isMeasuring)
return;
final int itemsCount=listView.getAdapter().getCount();
listView.smoothScrollToPositionFromTop(itemsCount-1,0,1000);
_startTime=System.currentTimeMillis();
_isMeasuring=true;
}
});
// creating the adapter of the listView
listView.setAdapter(new BaseAdapter()
{
@Override
public View getView(final int position,final View convertView,final ViewGroup parent)
{
final Field field=fields[position%fields.length];
// final View inflatedView=convertView!=null ? convertView : inflater.inflate(R.layout.list_item,null);
final View inflatedView=inflater.inflate(R.layout.list_item,null);
final ImageView imageView=(ImageView)inflatedView.findViewById(R.id.imageView);
final TextView textView=(TextView)inflatedView.findViewById(R.id.textView);
textView.setText(field.getName());
try
{
final int imageResId=field.getInt(null);
imageView.setImageResource(imageResId);
}
catch(final Exception e)
{}
return inflatedView;
}
@Override
public long getItemId(final int position)
{
return 0;
}
@Override
public Object getItem(final int position)
{
return null;
}
@Override
public int getCount()
{
return LISTVIEW_ITEMS;
}
});
}
}
@all:我知道有优化的代码(使用convertView和viewHolder设计模式),因为我已经提到的由谷歌提出的ListView中的视频。 相信我,我知道什么是更好的; 这是代码的整点。
上面的代码是为了显示它是更好地使用你(和视频)显示。 但首先我需要显示用简单的方式; 甚至用简单的方式应该仍然工作,因为我不存储位图或意见,自谷歌已经做了同样的测试(因此他们得到了性能比较的图表)。