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

时间:2015-07-01 13:19:30

标签: java android eclipse listview android-studio

我试图从我的服务器显示很多图像。由于我使用的是AMazon 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;
    }
}

请注意执行者。这是正确和合乎逻辑的做法,还是我完全错了,我需要制作任何其他缓存类型的东西?

2 个答案:

答案 0 :(得分:1)

图像下载,缓存,存储在滚动列表中是一个非常复杂的情况,我建议没有人自己做。

相反,你应该做大多数应用程序所做的事情,使用专门用于工作的第三方库我会指向你当前“最好”的3个,选择你喜欢的。

答案 1 :(得分:0)

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

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