setImageBitmap()滞后于UI

时间:2014-09-23 16:07:01

标签: android imageview android-imageview

当我在任何 imageView 上致电setImageBitmap()时,它会滞后于用户界面。我正在使用 listView ,因此我必须在滚动时设置imageView。请不要建议使用Picasso或其他图像下载帮助程序,因为问题与下载问题无关,并且它对使用这种库没有帮助。

编辑:
适配器:

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

}

2 个答案:

答案 0 :(得分:0)

您可以使用ViewHolder Design Pattern

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

使用图像占位符可防止列表图像混乱,并在下载完成后将图像占位符替换为图像(如果正在显示)或

你可以使用新的android小部件:

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

答案 1 :(得分:0)

我已经通过减少gc调用和组织我的适配器解决了我的问题。但真正的问题是文件输出。我减少了对文件输出函数的调用,它解决了我的问题。我将所有文件输出放在onPause方法中。应用程序暂停时会略微滞后,但这是一种更好的方式。