Android 在listView中显示来自SQlite的图像滞后
我在列表视图中显示图像和一些文本,当用户捕获他的图像时,我将其作为blob存储在db中,并在listview中显示,但有时会出现崩溃 下面是我的Dbutility类,用于转换字节[]中的图像和位图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
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的建议来存储图像。任何压缩都会影响性能,即性能更差。