Android base64图像的recyclerview滚动缓慢且滞后
我使用的是一个recycler视图,在该视图中,我有一个从服务器获取的base64字符串形式的图像列表。下面是我正在使用的适配器代码,我正在asynctask中将base64字符串转换为位图。当我在图像列表中滚动时,滚动速度慢且滞后。如何优化代码以使其平滑Android base64图像的recyclerview滚动缓慢且滞后,android,optimization,scroll,android-asynctask,android-recyclerview,Android,Optimization,Scroll,Android Asynctask,Android Recyclerview,我使用的是一个recycler视图,在该视图中,我有一个从服务器获取的base64字符串形式的图像列表。下面是我正在使用的适配器代码,我正在asynctask中将base64字符串转换为位图。当我在图像列表中滚动时,滚动速度慢且滞后。如何优化代码以使其平滑 public class ImageListAdapter extends RecyclerView.Adapter<ImageListAdapter.MyViewHolder> { private Array
public class ImageListAdapter extends RecyclerView.Adapter<ImageListAdapter.MyViewHolder> {
private ArrayList<Message> imagesEncodedList;
private Context context;
public ImageListAdapter(Context context, ArrayList<Message> imagesEncodedList) {
this.imagesEncodedList = imagesEncodedList;
this.context = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_image_list, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
if (imagesEncodedList.get(position).getImage() != null)
{
DownloadImageTask downloadImageTask=new DownloadImageTask(holder.imageView);
downloadImageTask.execute(imagesEncodedList.get(position).getImage());
}
else
{
DownloadImageTask downloadImageTask=new DownloadImageTask(holder.imageView);
downloadImageTask.execute(UriToBase64(Uri.parse(imagesEncodedList.get(position).getUri())));
}
if(imagesEncodedList.get(position).getPosted())
holder.item.setBackgroundResource(R.drawable.greenbordercolour);
else
holder.item.setBackgroundResource(R.drawable.redbordercolour);
}
@Override
public int getItemCount() {
return imagesEncodedList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private LinearLayout item;
public MyViewHolder(View view) {
super(view);
imageView = (ImageView) view.findViewById(R.id.imageItem);
item=(LinearLayout)view.findViewById(R.id.item);
}
}
private Bitmap getResizedBitmap(Bitmap image, int bitmapWidth, int bitmapHeight) {
return Bitmap.createScaledBitmap(image, bitmapWidth, bitmapHeight, true);
}
private String bitmapToBase64(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
return Base64.encodeToString(byteArray, Base64.DEFAULT);
}
private String UriToBase64(Uri uri) {
Bitmap bm = null;
try {
bm = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
} catch (IOException e) {
Log.e("BHUVNESH", "IOException" + e);
e.printStackTrace();
}
Bitmap resizedBitmap = getResizedBitmap(bm, 300, 300);
return bitmapToBase64(resizedBitmap);
}
private class DownloadImageTask extends AsyncTask<String, Integer, Bitmap> {
ImageView imageView;
DownloadImageTask(ImageView imageView)
{
this.imageView=imageView;
}
protected Bitmap doInBackground(String... urls) {
byte[] imageAsBytes = Base64.decode(urls[0].getBytes(), Base64.DEFAULT);
return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Bitmap result) {
imageView.setImageBitmap(result);
}
}
}
公共类ImageListAdapter扩展了RecyclerView.Adapter{
私有ArrayList imagesEncodedList;
私人语境;
公共ImageListAdapter(上下文,ArrayList imagesEncodedList){
this.imagesEncodedList=imagesEncodedList;
this.context=上下文;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.item\u image\u list,父项,false);
返回新的MyViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
if(imagesEncodedList.get(position).getImage()!=null)
{
DownloadImageTask DownloadImageTask=新的DownloadImageTask(holder.imageView);
下载ImageTask.execute(imagesEncodedList.get(position.getImage());
}
其他的
{
DownloadImageTask DownloadImageTask=新的DownloadImageTask(holder.imageView);
下载ImageTask.execute(UriToBase64(Uri.parse(imagesEncodedList.get(position.getUri()));
}
if(imagesEncodedList.get(position.getPosted())
支架.项目.立根资源(R.可绘制.绿色边框);
其他的
支架.项目.立根资源(R.可绘制.红色边框);
}
@凌驾
public int getItemCount(){
返回imagesEncodedList.size();
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
私人影像视图;
私人线路布置项目;
公共MyViewHolder(视图){
超级(视图);
imageView=(imageView)view.findViewById(R.id.imageItem);
item=(LinearLayout)view.findViewById(R.id.item);
}
}
私有位图getResizedBitmap(位图图像、int-bitmapWidth、int-bitmapHeight){
返回Bitmap.createScaledBitmap(图像、位图宽度、位图高度、true);
}
专用字符串bitmapToBase64(位图){
ByteArrayOutputStream ByteArrayOutputStream=新建ByteArrayOutputStream();
compress(bitmap.CompressFormat.PNG,100,byteArrayOutputStream);
字节[]byteArray=byteArrayOutputStream.toByteArray();
返回Base64.encodeToString(byteArray,Base64.DEFAULT);
}
私有字符串UriToBase64(Uri){
位图bm=null;
试一试{
bm=MediaStore.Images.Media.getBitmap(context.getContentResolver(),uri);
}捕获(IOE异常){
Log.e(“bhunnesh”、“IOException”+e);
e、 printStackTrace();
}
位图resizedBitmap=getResizedBitmap(bm,300300);
返回bitmapToBase64(resizedBitmap);
}
私有类DownloadImageTask扩展了AsyncTask{
图像视图图像视图;
下载ImageTask(ImageView ImageView)
{
this.imageView=imageView;
}
受保护位图doInBackground(字符串…URL){
byte[]imageAsBytes=Base64.decode(URL[0].getBytes(),Base64.DEFAULT);
返回BitmapFactory.decodeByteArray(imageAsBytes,0,imageAsBytes.length);
}
受保护的void onProgressUpdate(整数…进度){
}
受保护的void onPostExecute(位图结果){
设置图像位图(结果);
}
}
}
始终使用毕加索/glide库在回收视图中设置图像 删除DownloadImageTask有两个原因:
享受。
我正在从服务器获得base64字符串。不,你没有。从媒体存储中检索位图并将其转换为base64字符串,该字符串作为参数提供给异步任务执行方法。然后,asynctask将base64转换为位图。整个结构没有意义。首先,不要使用UriToBase64()
<代码>下载ImageTask.execute(UriToBase64(Uri.parse(imagesEncodedList.get(position.getUri()))代码>。不可能的代码。@greenapps请忽略else条件..查看if条件..imagesEncodedList.get(position).getImage()
。将返回base64编码的字符串。但是我们看不到.getImage()
在做什么。不能忽略else条件,因为这是滚动过程中使用的条件。asynctask不适合这种操作
。不同意。使用异步任务非常好。正是doInBackground中的代码完成了这项工作。“AsyncTasks最好用于短期操作(最多几秒钟)。如果您需要让线程长时间运行,强烈建议您使用java.util.concurrent pacake提供的各种API,如Executor、ThreadPoolExecutor和FutureTask。”不适用于下载文件。。。