从服务器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 中加载多个图像
当我在我的 android 应用程序中从图库中加载图像时,为啥位图返回较小的图像?