从服务器android在gridView中加载图像

Posted

技术标签:

【中文标题】从服务器android在gridView中加载图像【英文标题】:Loading images in a gridView from server android 【发布时间】:2015-09-18 16:24:14 【问题描述】:

我正在尝试显示来自我的服务器的大量图像。由于我使用的是亚马逊 s3 服务,因此没有常规链接。这是我下载图像的代码。由于我需要减小图像大小,这是实现平滑滚动的更好方法还是我需要做其他事情

    public class PinsListAdapter extends BaseAdapter

    private Activity mContext;
    private ArrayList<PingModel> pings = new ArrayList<PingModel>();
    private LayoutInflater inflater;

    public PinsListAdapter(Activity context, ArrayList<PingModel> pings)
    
        super();
        this.mContext = context;
        this.pings = pings;
        inflater = (LayoutInflater) this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    

    @Override
    public int getCount()
    
        return pings.size();
    

    @Override
    public Object getItem(int arg0)
    
        return null;
    

    @Override
    public long getItemId(int arg0)
    
        return 0;
    

    private static class ViewHolder
    
        public ImageView vidImgIndicator;
        public ImageView pinImg;
        public ImageView progress;
    

    @Override
    public View getView(int position, View convertView, final ViewGroup parent)
    
        final PingModel ping = pings.get(position);
        ViewHolder holder = null;

        if (convertView == null)
        
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.adapter_pin_row, parent, false);

            holder.pinImg    = (ImageView) convertView.findViewById(R.id.pinImg);
            holder.progress  = (ImageView) convertView.findViewById(R.id.progress);

            holder.vidImgIndicator  = (ImageView) convertView.findViewById(R.id.vidImgIndicator);

            Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.rotating_img);
            holder.progress.setAnimation(anim);

            convertView.setTag(holder);
        
        else
        
            holder = (ViewHolder) convertView.getTag();
        

        final ViewHolder mainHolder = holder;

        holder.vidImgIndicator.setVisibility(View.GONE);

        final String url = ping.getLocalMediaUrl(mContext);
        if (url != null) /* Image is already placed */
        
            if (ping.mediaAttachmentType == PingModel.PING_MEDIA_ATTACHMENT_TYPE_PHOTO)
            
                if(ping.thumbnail == null)
                
                    ping.thumbnail = ImageUtils.getBitmapFromFile(url, 80);
                
            
            else if (ping.mediaAttachmentType == PingModel.PING_MEDIA_ATTACHMENT_TYPE_VIDEO)
            
                if(ping.thumbnail == null)
                
                    //ping.thumbnail = ThumbnailUtils.createVideoThumbnail(url, MediaStore.Images.Thumbnails.MINI_KIND );
                
                if (ping.thumbnail != null)
                    mainHolder.vidImgIndicator.setVisibility(View.VISIBLE);
            

            mainHolder.pinImg.setImageBitmap(ping.thumbnail);
        
        else
        
            holder.pinImg.setImageDrawable(null);
            if (ping.isMediaBeingDownloaded == false)
            
                AppManager.getInstance().executor.execute(new Runnable()
                
                    public void run()
                    
                        ping.isMediaBeingDownloaded = true;
                        ApiManager.getInstance().pingManager.downloadMediaOfPingFromServer(ping);
                        ping.isMediaBeingDownloaded = false;
                        if (ping.mediaAttachmentType == PingModel.PING_MEDIA_ATTACHMENT_TYPE_PHOTO)
                        
                            ping.thumbnail = ImageUtils.getBitmapFromFile(url, 80);
                        
                        else if (ping.mediaAttachmentType == PingModel.PING_MEDIA_ATTACHMENT_TYPE_VIDEO)
                        
                            ping.thumbnail = ThumbnailUtils.createVideoThumbnail(url, MediaStore.Images.Thumbnails.MINI_KIND);
                        

                        mContext.runOnUiThread(new Runnable()
                        
                            @Override
                            public void run()
                            
                                notifyDataSetChanged();
                            
                        );
                    
                );
            
        

        return convertView;
    

请注意执行者。这是正确且合乎逻辑的做法,还是我做错了,我需要做任何其他缓存类型的事情?

【问题讨论】:

【参考方案1】:

图像下载、缓存、存储在滚动列表中是一个非常复杂的情况,我建议大家不要自己做。

相反,您应该像大多数应用一样,使用专门用于这项工作的 3rd 方库

毕加索-https://github.com/square/picasso 滑翔 - https://github.com/bumptech/glide 壁画 - https://github.com/facebook/fresco

【讨论】:

我刚刚提到,我没有任何特定链接,因为我正在从 S3 下载,所以我实际上无法使用这些库。我也不想将图像放在长期缓存中。【参考方案2】:

您必须始终在后台线程上加载图像,甚至是缩略图,除非它们已经在内存中。

您可以使用 Picasso 并实现自己的 RequestHandler,从 S3 下载图像,它将为您提供更高的性能和灵活性。

【讨论】:

以上是关于从服务器android在gridView中加载图像的主要内容,如果未能解决你的问题,请参考以下文章

无法在 RemoteViewsFactory 中加载多个图像

QML:在 GridView 中加载图像

当我在我的 android 应用程序中从图库中加载图像时,为啥位图返回较小的图像?

Android Recycler 视图使用异步任务从图库中加载图像

在 Kivy 中从内存中加载图像

为啥 Glide 没有在 android 中加载 https 图像?