2011-12-29 4 views
1

Я разрабатываю приложение для tivi box на базе Android2.2. У меня есть экран загрузки, и все данные были загружены. После загрузки данных он переключается на главный экран. Мой домашний экран имеет enter image description hereПроблема с сборкой мусора Android

4 относительных макета одинаковы. enter image description here

Когда я перехожу из сетки в ImageButtons и наоборот, многого огня GC в logcat. Поэтому при перемещении между элементами это очень медленно.

enter image description here

я пытался использовать распределение трекер и найти его выделяется много в text.staticLayout каждый раз, когда я двигаться между пунктами. Когда я удаляю 2 relativelayout в scrollview, GC все еще срабатывает, но анимация работает медленнее. Поэтому я думаю, что моя проблема - прокрутка. Можете ли вы показать мой, как найти то, что причина много GC (руководство для более эффективного использования распределения трекера. Я прочитал 2 статьи на Romain Guy блог о DDMS и Managerment памяти/O Google I для Android.) enter image description here

Мои адаптер простой. Я также пытаюсь удалить все applyReflection, настраиваемый шрифт, так что это только getName из Item и установить TextView. Но он все еще медленный. applyReflection класс от 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; 
} 

Спасибо за вашу помощь. Я новый Android

ответ

0

Я столкнулся с ошибкой GC в Android, на которой я нашел обходное решение, чтобы правильно собрать этот мусор. Возможно, это применимо и к вашей ситуации.

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

Могу ли я просто расширить свой текущий класс от вашей лучшей активности, не так ли? И сохранить мой текущий код в onCreate? –

+0

да, все. lemme знаю, если это поможет! :) – swinefeaster

0

в вашем коде:

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

Utils.applyReflection является создание растрового изображения или нет?

Если создать, этот метод будет блокироваться, а создание растрового изображения приведет к низкому уровню громкости gc.

+0

Класс ApplyReflection из этого файла: http: //www.inter-fuser.com/2009/12/android-reflections-with-bitmaps.html. Мой элемент имеет imagelink и я загружаю его позже (используя ImageDownloader из GoogleTV: http://code.google.com/p/googletv-video-player/source/browse/src/com/example/tv/videoplayer/ImageDownloader.java ? spec = svnc5ce73eef28e2b59891ce43af8fb668d5af0f85b & r = c5ce73eef28e2b59891ce43af8fb668d5af0f85b) и applyReflection. Я попытался удалить растровое изображение, так что это только getName из Item и установить в TextView. Но это не помощь, это все еще медленно. –