Android base64图像的recyclerview滚动缓慢且滞后

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

我使用的是一个recycler视图,在该视图中,我有一个从服务器获取的base64字符串形式的图像列表。下面是我正在使用的适配器代码,我正在asynctask中将base64字符串转换为位图。当我在图像列表中滚动时,滚动速度慢且滞后。如何优化代码以使其平滑

 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成本太高,稍后您需要将其转换为位图,因此这是工作的两倍

  • asynctask不适合那种操作

  • 您应该使用诸如

    或者类似的东西,有三行代码,你就可以把图像从服务器上传到imageview,而且速度很快


    享受。

    我正在从服务器获得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。”不适用于下载文件。。。