2011-12-29 5 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 relativelayoutを削除すると、GCはまだ起動しますが、アニメーションは遅くなりません。だから私の問題はscrollviewだと思う。 あなたは enter image description here

私の(私はDDMSおよびAndroid向けのGoogle I/Oメモリmanagermentについてのロマン・ガイのブログ上の2件の記事を。読む。より効果的に配分トラッカーを使用するように導く)私のGCの多く起こすものを見つける方法を示していますができますアダプタは簡単です。私はまた、すべての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から派生します。これはあなたのコードに...

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

私の現在のクラスをあなたのより優れた活動から単純に拡張するだけでいいですか?私の現在のコードをonCreateに保存しますか? –

+0

はい、それです。助けがあれば分かります! :) – swinefeaster

0

姿勢変更のすべてのドローアブルをクリーンアップ、およびアクティビティ・スイッチなどの可能性が高いでしょう:

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

Utils.applyReflectionは、ビットマップを作成することですか?

作成すると、このメソッドはブロックされ、ビットマップを作成するとメモリのgcが低くなります。

+0

このtutからのApplyReflectionクラス:http://www.inter-fuser.com/2009/12/android-reflections-with-bitmaps.html。私のアイテムにはimagelinkがあり、後でそれをダウンロードします(GoogleTVのImageDownloaderを使用してください:http://code.google.com/p/googletv-video-player/source/browse/src/com/example/tv/videoplayer/ImageDownloader.java ?spec = svnc5ce73eef28e2b59891ce43af8fb668d5af0f85b&r = c5ce73eef28e2b59891ce43af8fb668d5af0f85b)とapplyReflection。私はビットマップを削除しようとしたのでItemからgetNameだけでTextViewに設定されています。しかし、それは助けにはならない、それはまだ遅いです。 –