我正在为Android2.2驱动的tivi盒开发应用程序。我有一个加载屏幕,所有数据都已下载。下载数据后,它将切换到主屏幕。我的主屏幕布局有
4个相对布局是相同的。
当我从gridview移动到ImageButtons时,在logcat中有很多GC火。因此,在物品之间移动时速度非常慢。
我尝试使用分配跟踪器,并且每当我在项目之间移动时,发现它在text.staticLayout中分配了很多。当我在scrollview中删除2 relativelayout时,GC仍会激活,但动画速度较慢。所以我认为我的问题是scrollview。 你能告诉我如何找到导致很多GC的原因(更有效地使用分配跟踪器的指南。我在Romain Guy博客上阅读了2篇关于DDMS和Android的谷歌I / O内存管理的文章。)
我的适配器很简单。我还尝试删除所有applyReflection,自定义字体,因此它只是来自Item的getName并设置为TextView。但它仍然缓慢。来自 this tut
的applyReflection类public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Clip item = listClip.get(position);
View itemView;
ViewHolder holder;
if(convertView == null){
LayoutInflater inflater = LayoutInflater.from(mContext);
itemView = inflater.inflate(R.layout.griditem_home, null);
holder = new ViewHolder();
holder.icon = (ImageView)itemView.findViewById(R.id.filmIcon);
holder.genre = (TextView)itemView.findViewById(R.id.cliptype);
holder.view = (TextView)itemView.findViewById(R.id.clipview);
holder.name = (TextView)itemView.findViewById(R.id.clipName);
holder.view.setTypeface(myriadRegular);
holder.name.setTypeface(myriadBold);
holder.genre.setTypeface(myriadRegular);
itemView.setTag(holder);
} else {
itemView = convertView;
holder = (ViewHolder) itemView.getTag();
}
holder.icon.setImageBitmap(Utils.applyReflection(bitmap));
holder.name.setText(item.getName());
holder.view.setText("Number of view: "+item.getNumberView());
holder.genre.setText(item.getTypename());
return itemView;
}
class ViewHolder {
ImageView icon;
TextView name, genre, view;
}
感谢您的帮助。我是新的Android
答案 0 :(得分:0)
我在Android中遇到了一个GC错误,我找到了一个解决方法来正确收集垃圾。也许这也适用于你的情况。
http://code.google.com/p/android/issues/detail?id=8488
这是一个简单的解决方案。只是派生自BetterActivity而不是Activity。这将清除方向更改时的所有可绘制对象,并可能在活动开关等... ...
public abstract class BetterActivity extends Activity
{
@Override
protected void onResume()
{
System.gc();
super.onResume();
}
@Override
protected void onPause()
{
super.onPause();
System.gc();
}
@Override
public void setContentView(int layoutResID)
{
ViewGroup mainView = (ViewGroup)
LayoutInflater.from(this).inflate(layoutResID, null);
setContentView(mainView);
}
@Override
public void setContentView(View view)
{
super.setContentView(view);
m_contentView = (ViewGroup)view;
}
@Override
public void setContentView(View view, LayoutParams params)
{
super.setContentView(view, params);
m_contentView = (ViewGroup)view;
}
@Override
protected void onDestroy()
{
super.onDestroy();
// Fixes android memory issue 8488 :
// http://code.google.com/p/android/issues/detail?id=8488
nullViewDrawablesRecursive(m_contentView);
m_contentView = null;
System.gc();
}
private void nullViewDrawablesRecursive(View view)
{
if(view != null)
{
try
{
ViewGroup viewGroup = (ViewGroup)view;
int childCount = viewGroup.getChildCount();
for(int index = 0; index < childCount; index++)
{
View child = viewGroup.getChildAt(index);
nullViewDrawablesRecursive(child);
}
}
catch(Exception e)
{
}
nullViewDrawable(view);
}
}
private void nullViewDrawable(View view)
{
try
{
view.setBackgroundDrawable(null);
}
catch(Exception e)
{
}
try
{
ImageView imageView = (ImageView)view;
imageView.setImageDrawable(null);
imageView.setBackgroundDrawable(null);
}
catch(Exception e)
{
}
}
// The top level content view.
private ViewGroup m_contentView = null;
}
答案 1 :(得分:0)
:
holder.icon.setImageBitmap(Utils.applyReflection(bitmap));
Utils.applyReflection是否创建位图?
如果创建,此方法将被阻止,并且创建位图将导致内存中的gc变低。