Android 在listView中显示来自SQlite的图像滞后

Android 在listView中显示来自SQlite的图像滞后,android,sqlite,listview,imageview,lag,Android,Sqlite,Listview,Imageview,Lag,我在列表视图中显示图像和一些文本,当用户捕获他的图像时,我将其作为blob存储在db中,并在listview中显示,但有时会出现崩溃 下面是我的Dbutility类,用于转换字节[]中的图像和位图 public class DbBitmapUtility{ public static byte[] getImageBytes(Bitmap bitmap) { ByteArrayOutputStream stream = new ByteArrayOutputStre

我在列表视图中显示图像和一些文本,当用户捕获他的图像时,我将其作为blob存储在db中,并在listview中显示,但有时会出现崩溃

下面是我的Dbutility类,用于转换字节[]中的图像和位图

public class DbBitmapUtility{
       public static byte[] getImageBytes(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        return stream.toByteArray();
    }

    public static Bitmap getImage(byte[] image) {
        return BitmapFactory.decodeByteArray(image,0,image.length);
    }

    public static byte[] getBytes(InputStream inputStream) throws IOException {
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
        int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];

        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            byteBuffer.write(buffer, 0, len);
        }
        return byteBuffer.toByteArray();
    }


}
这是我的CustomerAdapter课程

class CustomerAdapter extends CursorAdapter {
private LayoutInflater mInflater;
private Bitmap bitmap=null;

CustomerAdapter(Context context, Cursor c, int flags) {
    super(context, c, flags);
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View v = mInflater.inflate(R.layout.custom_list, parent, false);
    ViewHolder holder = new ViewHolder();
    holder.txtFname = (TextView) v.findViewById(R.id.txtFname);
    holder.txtLname = (TextView) v.findViewById(R.id.txtLname);
    holder.txtPaid = (TextView) v.findViewById(R.id.txtPaidBill);
    holder.txtUnPaid = (TextView) v.findViewById(R.id.txtUnpaid);
    holder.txtTotalUnPaid = (TextView) v.findViewById(R.id.txtTotalUnpaid);
    holder.txtCustomerID = (TextView)v.findViewById(R.id.txtCustomerID);
    holder.txtMobileNo = (TextView)v.findViewById(R.id.txtMobileNo);
    holder.imageView = (CircleImageView) v.findViewById(R.id.user_pic);
    v.setTag(holder);
    return v;
}

@Override
public void bindView(View view, final Context context, Cursor cursor) {
    final ViewHolder holder = (ViewHolder) view.getTag();

    //getting image byte[] from db
    byte[] img = cursor.getBlob(cursor.getColumnIndex(Customer.USERAVATAR));
    if(img !=null) {
        //getting bitmap from byte[]
        bitmap = DbBitmapUtility.getImage(img);
    }
    if (bitmap != null) {
        //setting image to imageView
        holder.imageView.setImageBitmap(bitmap);
    }

    holder.txtFname.setText(cursor.getString(cursor.getColumnIndex(Customer.FNAME)));
    holder.txtLname.setText(cursor.getString(cursor.getColumnIndex(Customer.LNAME)));
    holder.txtPaid.setText(cursor.getString(cursor.getColumnIndex(Customer.PAID)));
    holder.txtUnPaid.setText(cursor.getString(cursor.getColumnIndex(Customer.UNPAID)));
    holder.txtTotalUnPaid.setText(cursor.getString(cursor.getColumnIndex(Customer.UNPAID))+" ₹");
    holder.txtCustomerID.setText(String.valueOf(cursor.getInt(cursor.getColumnIndex(Customer.KEYID))));
    holder.txtMobileNo.setText(cursor.getString(cursor.getColumnIndex(Customer.MOBILENO)));

    //imageView Listener
    holder.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent(context,UpdateCustomer.class);
            i.putExtra("ID", holder.txtCustomerID.getText().toString());
            i.putExtra("FNAME",holder.txtFname.getText().toString());
            i.putExtra("MOBILENO", holder.txtMobileNo.getText().toString());
            context.startActivity(i);

        }
    });

}

private class ViewHolder {
    TextView txtFname;
    TextView txtLname;
    TextView txtPaid;
    TextView txtUnPaid;
    TextView txtTotalUnPaid;
    TextView txtCustomerID;
    TextView txtMobileNo;
    CircleImageView imageView;

  }
}
Logcat
02-23 18:07:16.017 20945-1125/shazdroid.com.raviapp V/FA:使用测量服务
02-23 18:07:16.022 20945-1125/shazdroid.com.raviapp V/FA:连接到远程服务
02-23 18:07:16.027 20945-20945/shazdroid.com.raviapp W/ActivityThread:AppLock checkAppLockState isAppLocked=false pkgName=shazdroid.com.raviapp showWhenLocked=false
02-23 18:07:16.052 20945-20945/shazdroid.com.raviapp I/Timeline:Timeline:Activity\u idle id:android.os。BinderProxy@383cc74时间:368732045
02-23 18:07:16.087 20945-1125/shazdroid.com.raviapp V/FA:活动恢复,时间:1145561340
02-23 18:07:16.097 20945-1125/shazdroid.com.ravid/FA:连接到远程服务
02-23 18:07:16.097 20945-1125/shazdroid.com.raviapp V/FA:处理排队服务任务:1
02-23 18:07:17.862 20945-20945/shazdroid.com.raviapp D/ViewRootImpl:viewPostimeiInputStage进程指针0
02-23 18:07:17.982 20945-20945/shazdroid.com.raviapp D/ViewRootImpl:viewPostimeiInputStage进程指针1
02-23 18:07:18.782 20945-20945/shazdroid.com.raviapp D/ViewRootImpl:viewPostimeiInputStage进程指针0
02-23 18:07:18.817 20945-20945/shazdroid.com.raviapp D/ViewRootImpl:viewPostimeiInputStage进程指针1
02-23 18:07:19.177 20945-20945/shazdroid.com.raviapp W/CursorWindow:窗口已满:请求分配367444字节,可用空间339159字节,窗口大小2097152字节
02-23 18:07:19.592 20945-20955/shazdroid.com.raviapp I/art:背景部分并发标记扫描GC释放1157(61KB)AllocSpace对象,5(19MB)LOS对象,20%空闲,61MB/77MB,暂停811U总计129.950ms
02-23 18:07:19.822 20945-20945/shazdroid.com.raviapp D/ViewRootImpl:viewPostimeiInputStage进程指针0
02-23 18:07:19.832 20945-20945/shazdroid.com.raviapp D/ViewRootImpl:viewPostimeiInputStage进程指针1
02-23 18:07:20.932 20945-20945/shazdroid.com.raviapp D/ViewRootImpl:viewPostimeiInputStage进程指针0
02-23 18:07:21.047 20945-20945/shazdroid.com.raviapp D/ViewRootImpl:viewPostimeiInputStage进程指针1
02-23 18:07:21.117 20945-1125/shazdroid.com.raviapp V/FA:不活动,断开与服务的连接
02-23 18:07:21.892 20945-20945/shazdroid.com.raviapp D/ViewRootImpl:viewPostimeiInputStage进程指针0
02-23 18:07:22.017 20945-20945/shazdroid.com.ravid/ViewRootImpl:viewPostimeiInputStage进程指针1

我是android新手,请帮助我,我听说过缓存,但不知道如何实现它。
如果我将图像设置为一个客户,即使所有imageView在整个列表中都显示相同的图像,但稍后将图像设置为所有客户后,它是否正常?

在此处发布日志,以便我们可以帮助您将图像存储在本地存储-内部(应用程序特定位置,即存储db/首选项文件的位置-
/data/data/your_PACKAGE\u NAME/
)或外部(公共类图像文件夹)@Shaz不,这是不可能的!Shaz您可以按照@MarkKeen的建议来存储图像。任何压缩都会影响性能,即性能更差。