2014-09-23 1 views
2

imageViewsetImageBitmap()을 호출하면 UI가 지연됩니다. 그리고 listView을 사용하고 있으므로 스크롤하는 동안 imageView를 설정해야합니다. Picasa 또는 다른 이미지 다운로드 도우미를 사용하여 문제를 다운로드하는 것과 관련이 없으며 그러한 종류의 라이브러리를 사용하는 데 도움이되지 않기 때문에 제안하지 마십시오.setImageBitmap() lags UI

편집 :
어댑터 :

public class GönderiItemAdapter extends BaseAdapter{ 
    private final Activity mActivity; 
    private final Vector<String> mVeri; 
    private boolean mProfil = false; 
    private boolean mKullanıcı; 
    private boolean mArama = false; 
    private Profil mProfilBilgi; 
    private String mAramaString; 



public GönderiItemAdapter(Activity pActivity, String[] pVeri, boolean pKullanıcı, Profil pProfililgi){ 

    this(pActivity, pVeri); 

    mProfil  = true; 
    mKullanıcı = pKullanıcı; 
    mProfilBilgi = pProfililgi; 

} 

public GönderiItemAdapter(Activity pActivity, final String[] pVeri, String pAramaString){ 

    this(pActivity, pVeri); 

    mAramaString = pAramaString; 
    mArama = true; 
} 

public GönderiItemAdapter(Activity pActivity, final String[] pVeri){ 

    if(Ayarlar.sGönderiler == null) 
     Ayarlar.yükleGönderiler(pActivity); 

    mActivity = pActivity; 

    mVeri = new Vector<String>(); 

    for(int i = 0; i < pVeri.length; ++i) 
     mVeri.add(pVeri[ i ]); 

    mProfil  = false; 

} 

public void ekleÜst(String[] pVeri){ 

    for(int i = pVeri.length - 1; i >= 0; --i){ 

     Gönderi gönderi = Ayarlar.alGönderi(pVeri[ i ], mActivity, false); 

     if(!gönderi.mGönderenId.equals("-1")) 
      mVeri.add(0 , pVeri[ i ]); 

    }  
} 

public void ekleAlt(String[] pVeri, final TextView pMetin){ 

    for(int i = 0; i < pVeri.length; ++i){ 

     Gönderi gönderi = Ayarlar.alGönderi(pVeri[ i ], mActivity, false);    

     if(gönderi.mGönderenId.equals("-1")) 
      mActivity.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        pMetin.setText(R.string.dahayok); 
       } 
      }); 

     else 
      mVeri.add(pVeri[ i ]); 
    } 

} 

public void al(){ 
    GenelEşzamansızİşlem giş = new GenelEşzamansızİşlem(); 
    giş.arkaplanİşlem = new Thread(new Runnable() { 

     @Override 
     public void run() { 

      for(int i = 0; i < mVeri.size(); ++i) 
       Ayarlar.alGönderi(mVeri.get(i), mActivity, false); 

     } 
    }); 
    if(Araçlar.mobilVeri(mActivity)) 
     giş.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); 

    else 
     giş.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
} 

static public void al2(final String[] pVeri, final Activity pActivity){ 
    GenelEşzamansızİşlem giş = new GenelEşzamansızİşlem(); 
    giş.arkaplanİşlem = new Thread(new Runnable() { 

     @Override 
     public void run() {  
      if(Ayarlar.sGönderiler == null) 
       Ayarlar.yükleGönderiler(pActivity); 

      Vector<String> idVector = new Vector<String>(); 

      for(int i = 0; i < pVeri.length; ++i) 
       if(!Ayarlar.sGönderiler.containsKey(pVeri[i])) 
        idVector.add(pVeri[i]); 

      String[] idArray = new String[ idVector.size() ]; 

      for(int i = 0; i < idArray.length; ++i) 
       idArray[ i ] = idVector.get(i); 

      if(idArray.length > 0) 
       Ayarlar.alTopluGönderi(idArray, pActivity); 

     } 
    }); 

    try{ 
     giş.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR).get(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 



public void güncelle(){ 

    for(int i = 0; i < mVeri.size(); ++i){ 
     Ayarlar.alGönderi(mVeri.get(i), mActivity, false).güncelle(mActivity); 
    } 

} 

@Override 
public int getCount(){ 

    if(mProfil) 
     return mVeri.size() + 1; 

    return mVeri.size(); 
} 

@Override 
public int getViewTypeCount(){ 
    return 2; 
} 

@Override 
public Object getItem(int arg0) { 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public int getItemViewType(int position){ 

    if(mProfil && position == 0) 
     return 1; 
    else 
     return 0; 
} 

@Override 
public boolean areAllItemsEnabled(){ 
    return false; 
} 

@Override 
public boolean isEnabled(int position){ 
    return false; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    LayoutInflater inflater = (LayoutInflater) mActivity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if(mProfil && position == 0) 
    { 

     View v = inflater.inflate(R.layout.header_profil, null); 


     final Button sağ  = (Button) v.findViewById(R.id.sag ); 
     View line1   =   v.findViewById(R.id.line1); 
     final Button orta  = (Button) v.findViewById(R.id.orta); 
     View line2   =   v.findViewById(R.id.line2); 
     final Button sol  = (Button) v.findViewById(R.id.sol ); 

     if(mKullanıcı){ 

      sağ.setVisibility(View.VISIBLE); 

      sağ.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        ((ExplorerActivity)mActivity).yeniGönderi(); 
       } 
      }); 

      sağ.setText(R.string.yeniGonderi); 

     } 

     else{ 

      sağ.setVisibility(View.GONE); 
      line2.setVisibility(View.GONE); 

      if(!Ayarlar.sFavoriler.contains(mProfilBilgi.mID)) 
       sol.setText(R.string.favoriEkle); 
      else 
       sol.setText(R.string.favoriCikar); 

      sol.setVisibility(View.VISIBLE); 

      sol.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        ((ExplorerActivity)mActivity).favori(mProfilBilgi.mID); 

        if(!Ayarlar.sFavoriler.contains(mProfilBilgi.mID)) 
         sol.setText(R.string.favoriEkle); 
        else 
         sol.setText(R.string.favoriCikar); 
       } 
      }); 

     } 

     v.findViewById(R.id.profil).setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ((ExplorerActivity)mActivity).gösterProfil(mProfilBilgi); 
      } 
     }); 

     return v; 
    } 

    else{ 

     if(mProfil) 
      position -= 1; 

     View v; 
     Gönderi g; 

     if(convertView == null){ 

      v = inflater.inflate(R.layout.gonderi_liste_nesnesi, null); 

      g = new Gönderi(); 
      g.mAnaDüzen   = (LinearLayout) v; 
      g.mProfilFotoğrafı = (CircularImageView) v.findViewById(R.id.profil_photo); 
      g.mGönderenAdı  = (TextView) v.findViewById(R.id.gonderen_adi); 
      g.mGönderiZamanı = (TextView) v.findViewById(R.id.gonderi_tarihi); 
      g.mDönem   = (TextView) v.findViewById(R.id.gonderen_donemi); 
      g.mGönderi   = (TextView) v.findViewById(R.id.gonderi); 
      g.mBeğen   = (TextView) v.findViewById(R.id.begen); 
      g.mBeğeniText  = (TextView) v.findViewById(R.id.begeniSayi); 

      v.setTag(g); 

     } 
     else{ 
      g = (Gönderi) convertView.getTag(); 
      v = convertView; 
     } 

     final Gönderi gönderi = Ayarlar.alGönderi(mVeri.get(position), mActivity, false); 

     g.mGönderenAdıString = gönderi.mGönderenAdıString; 
     g.mDüzenliTarih = gönderi.mDüzenliTarih; 
     g.mDönemString = gönderi.mDönemString; 
     g.mGönderiHamMetin = gönderi.mGönderiHamMetin; 
     g.mBeğeniTextString = gönderi.mBeğeniTextString; 

     g.mBeğeni  = gönderi.mBeğeni; 
     g.mBeğenildi = gönderi.mBeğenildi; 
     g.mBeğeniVerisi = gönderi.mBeğeniVerisi; 
     g.mGönderenId = gönderi.mGönderenId; 
     g.mBeğeniSayısı = gönderi.mBeğeniSayısı; 
     g.mGönderiId = gönderi.mGönderiId; 

     g.ayarla(mArama, mAramaString, mActivity); 


     if(!mArama){ 

      g.beğeniİşlemler(mActivity); 

      if(g.mBeğenildi){ 
       g.mBeğen.setOnClickListener(g.mBeğenmeİşlem); 

       g.mBeğen.setText(R.string.hoslanma); 
      } 

      else 
       g.mBeğen.setOnClickListener(g.mBeğenİşlem); 

      final Gönderi foo = g; 

      g.mBeğeniText.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        final Dialog dialog = new Dialog(mActivity); 

        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

        dialog.setContentView(R.layout.dialog_begeni); 

        ListView liste = (ListView) dialog.findViewById(R.id.liste); 

        Vector<Profil> profiller = new Vector<Profil>(); 

        for(int i = 0; i < foo.mBeğeni.size(); ++i){ 

         Profil p = Ayarlar.alProfil(foo.mBeğeni.get(i).mGönderenID , mActivity); 

         Log.w("id" , p.mID); 

         if(p != null && !p.mID.equals(Ayarlar.sMevcutId)) 
          profiller.add(p); 

        } 

        KartAdapter adapter = new KartAdapter(mActivity, profiller, mActivity, dialog); 

        liste.setAdapter(adapter); 

        if(profiller.size() != 0) 
         dialog.show(); 
       } 
      }); 


      g.mProfilFotoğrafı.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 
        ((ExplorerActivity) mActivity).açProfil(gönderi.mGönderenId); 
       } 
      }); 

      g.mGönderenAdı.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 
        ((ExplorerActivity) mActivity).açProfil(gönderi.mGönderenId); 
       } 
      }); 
     } 
     else{ 
      g.mAnaDüzen.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 
        ((ExplorerActivity) mActivity).açGönderi(gönderi.mGönderiId); 
       } 
      }); 
     } 

     return v; 
    } 
} 

} 
+1

이미지가 재활용하려는 메모리를 차지하므로 가비지 수집기가 시작될 가능성이 큽니다. 비트 맵의 ​​특성 (크기, 원점, 각 목록 항목마다 다른지 여부 등)에 대한 정보를 제공하지 않으면 질문에 대한 답변이 없습니다. –

+0

그들은 서버에서 다른 크기로 각 항목에 대해 다른로드 된 있지만 리소스에서 setdrawable 경우 문제가되지 않습니다. – Senhor

+0

ListView 사용하고 있기 때문에 나는 당신이 그것에 어떤 종류의 축소판이 있다고 가정합니다. 그리고 거기에 배치하기 위해 큰 비트 맵을로드하고 있습니다 (샘플 크기가 아님). 그러나이 작업을 수행하는 코드가 없으면 어떤 권장 사항도 제시 할 수 없습니다. Bitmap을 얻는 방법과 ImageView로 전달하는 방법을 코드로 게시 할 수 있습니까? 또한 ListView Adapter를 게시하는 경우에도 유용합니다. – Chaosit

답변

0

합니다. 그러나 실제 문제는 파일 출력 때문이었습니다. 필자는 파일 출력 기능에 대한 호출을 줄였으며 문제를 해결했습니다. 나는 모든 파일 출력을 onPause 메서드에 넣는다. 앱이 일시 중지되면 조금 뒤처져 있지만 더 좋은 방법입니다.

0

당신은 ViewHolder Design Pattern 사용할 수 있습니다 교체 위로 다운로드 후 엉망 목록 이미지를 방지하기 위해 이미지 자리 표시 자와

http://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder

완료를 이미지가있는 경우 이미지가있는 이미지 보관함 또는

새 안드로이드 위젯을 사용할 수 있습니다 : 나는 GC 호출을 줄이고 내 어댑터를 조직 내 문제를 해결 한

https://developer.android.com/preview/material/ui-widgets.html#recyclerview

+0

뷰 홀더 디자인 패턴을 사용하고 있지만 여전히 문제가 있습니다. – Senhor

+0

어댑터를 게시 할 수 있습니까? – mmlooloo

+0

글쓰기 게시 됨 – Senhor

관련 문제