2011-12-29 273 views
1

我正在开发一个由Android2.2驱动的tivi框应用程序。我有一个加载屏幕,所有的数据已经下载。数据下载后,它切换到主屏幕。我的主屏幕布局有enter image description here垃圾收集问题Android

4相对布局是相同的。 enter image description here

当我从gridview移动到ImageButtons,反之亦然,logcat中有很多GC火灾。所以在物品间移动时速度非常慢。

enter image description here

我试图用分配跟踪,并发现它每一次我的项目之间移动的时间投入大量的text.staticLayout。当我在滚动视图中删除2个相关布局时,GC仍然会启动,但动画不太慢。所以我认为我的问题是scrollview。 你能告诉我怎样查找原因GC的很多(指导更有效地使用分配的跟踪器。我读了罗曼盖伊博客2篇关于DDMS和Android的谷歌I/O内存managerment。) enter image description here

我适配器很简单。我也尝试删除所有applyReflection,自定义字体,所以它只是Item中的getName并设置为TextView。但它仍然缓慢。从this tut

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; 
} 

感谢applyReflection类的帮助。我是新的Android

回答

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; 
} 
+0

难道我只是简单地扩展我的课堂从你betteractivity,不是吗?并保持我的当前代码在onCreate? – 2012-01-03 08:45:14

+0

是的,就是这样。让我知道它是否有帮助! :) – swinefeaster 2012-01-03 10:17:35

0

在你的代码:

holder.icon.setImageBitmap(Utils.applyReflection(bitmap)); 

Utils.applyReflection是创建位图或没有?

如果创建,则此方法将阻塞,并且创建位图会导致内存中的gc偏低。

+0

ApplyReflection类从这个tut:http://www.inter-fuser.com/2009/12/android-reflections-with-bitmaps.html。我的物品有图像链接,稍后我会下载(使用GoogleTV的ImageDownloader:http://code.google.com/p/googletv-video-player/source/browse/src/com/example/tv/videoplayer/ImageDownloader.java ?spec = svnc5ce73eef28e2b59891ce43af8fb668d5af0f85b&r = c5ce73eef28e2b59891ce43af8fb668d5af0f85b)和applyReflection。我试图删除位图,所以它只是从项目getName并设置为TextView。但它没有帮助,它仍然很慢。 – 2011-12-29 09:17:33