android 商品浏览 从服务器端获取图片列表的相关问题

pricks 2014-08-19 10:13:20
我刚做android不久,接了个项目,项目中包含商品浏览的功能。
目前我在设计时,想了想,主要有以下几个问题不太清楚:
1、商品列表,界面风格做成list,一行显示一张图片,图片在左侧,右侧显示相关的文字,例如价格之类的。
当然也可以做成一行显示3张或4张图片,但是这样需要屏幕的自适应性非常好,所以初步决定放弃这个想法。不过如果有朋友这样做过,可以提供一些demo或者思路

2、图片列表界面,需要一次性从服务器端加载很多图片和文字。文字好解决,json即可。那么图片呢?大家是怎么加载的?我查了下,目前的思路是:第一次打开图片列表界面时,访问服务器,加载json字符串,里面包含了文字,和图片的ID或者图片的地址。然后解析json,每次解析出来一个图片的ID或者地址,就异步(或者多线程)向服务器发起请求,加载真正的图片(使用文件流)。这样,如果图片列表界面总共包含10个商品的话,打开该界面时,需要向服务器总共发起11次请求。第一次是请求总体的信息,后面的10次,每次请求一张图片。
不过个人感觉这样的思路好像哪里有点不对劲,貌似过多的向服务器请求信息,开销太大了,影响服务器的性能。
不知道你们是怎样处理的呢?

我还想到了另外一种思路,就是把这个界面做成web页,服务器提供html。但是这样的话,又会带来一系列问题,例如android如何与js交互呀之类的,所以决定初期放弃,不能为了解决一个问题,而引来额外的很多其他问题,得不偿失。

3、图片列表的分页问题。如果我们在PC的浏览器访问图片列表(例如淘宝),淘宝会查询出来成千上万的图片,并且以分页的形式显示。那么android上一般如何处理呢?是否也带分页?
我下载了淘宝手机app,发现商品查询页面,没有分页。并且淘宝为了解决内存占用的问题,一开始并不是加载所有的图片,而是当你往下滑的时候,滑到哪,才加载对应商品的图片。
不知道这个你们是怎样做的呢?

请真正做过的朋友给个思路,或者也可以给一些demo,不胜感激额!
...全文
632 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈译 2016-07-12
  • 打赏
  • 举报
回复
第二个问题的话,我是直接请求一次服务器,返回一个JSONObject,其中包含一个JSONArray,在这个JSONArray里面包含所有要显示的商品信息(如果商品太多的话就分批次调用,比如一次传十个商品这样),然后再解析成一个个的实体传给adapter 图片的话我用的SmartImageView,github上有,可以直接设置url来显示图片,比较方便
changzhengcome 2016-07-11
  • 打赏
  • 举报
回复
package changzheng.musicv4.entil; import java.io.File; import java.io.InputStream; import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import changzheng.musicv4.R; import changzheng.musicv4.util.HttpUtils; import android.content.Context; import android.graphics.Bitmap; import android.os.Handler; import android.os.Message; import android.widget.ImageView; import android.widget.ListView; /** * 异步批量加载图片的工具类 */ public class ImageLoader { private HashMap<String, SoftReference<Bitmap>> cache = new HashMap<String, SoftReference<Bitmap>>(); private Context context; private List<ImageLoadTask> tasks = new ArrayList<ImageLoadTask>(); private Thread workThread; private boolean isLoop = true; private ListView listView; private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case HANDLER_IMAGE_LOAD_SUCCESS: //给相应的ImageView设置Bitmap ImageLoadTask task = (ImageLoadTask) msg.obj; Bitmap bitmap = task.bitmap; ImageView imageView = (ImageView) listView.findViewWithTag(task.path); if(imageView != null){ if(bitmap!=null){ imageView.setImageBitmap(bitmap); }else{ imageView.setImageResource(R.drawable.ic_launcher); } } break; } } }; public static final int HANDLER_IMAGE_LOAD_SUCCESS = 1; public ImageLoader(Context context, ListView listView) { this.listView = listView; this.context = context; //启动工作线程 轮循任务集合 workThread = new Thread(){ public void run() { while(isLoop){ if(!tasks.isEmpty()){ //不是空集 ImageLoadTask task = tasks.remove(0); String url = task.path; //发送http请求 下载图片 Bitmap bitmap = loadBitmap(url); task.bitmap = bitmap; //更新界面 发消息给handler Message msg = new Message(); msg.what = HANDLER_IMAGE_LOAD_SUCCESS; msg.obj = task; handler.sendMessage(msg); }else{ //空集合 等待 try { synchronized (workThread) { workThread.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } } } }; workThread.start(); } /** * 通过url地址 发送http请求 获取图片 * @param url * @return */ public Bitmap loadBitmap(String url){ try { InputStream is = HttpUtils.getInputStream(url); //解析Bitmap 执行压缩算法 获取合适尺寸的图片 Bitmap bitmap = BitmapUtils.loadBitmap(is, 50, 50); //把bitmap存入内存缓存 cache.put(url, new SoftReference<Bitmap>(bitmap)); //把bitmap存入文件中 String filename = url.substring(url.lastIndexOf("/")+1); File file = new File(context.getCacheDir(), "images/"+filename); BitmapUtils.save(bitmap, file); return bitmap; } catch (Exception e) { e.printStackTrace(); } return null; } public void displayImage(String url, ImageView imageView){ //给ivPic设置图片 //先去内存缓存中查询 看有没有 SoftReference<Bitmap> ref=cache.get(url); if(ref!=null){ //以前存过 Bitmap bitmap = ref.get(); if(bitmap!=null) { //以前存的还没有被干掉 imageView.setImageBitmap(bitmap); return; } } //去文件缓存中读取 String filename = url.substring(url.lastIndexOf("/")+1); File file = new File(context.getCacheDir(), "images/"+filename); Bitmap bitmap = BitmapUtils.loadBitmap(file); if(bitmap!=null){ //一旦从文件中读取出来 先存入内存缓存 cache.put(url, new SoftReference<Bitmap>(bitmap)); imageView.setImageBitmap(bitmap); return; } // new Thread(){}.start(); 不能写 写了会卡 //向任务集合中添加一个图片下载任务 imageView.setTag(url); ImageLoadTask task = new ImageLoadTask(); task.path = url; tasks.add(task); synchronized (workThread) { //唤醒工作线程 起来干活 workThread.notify(); } } class ImageLoadTask { String path; //保存图片下载路径 Bitmap bitmap; //下载成功后的图片 } public void stopThread() { isLoop = false; synchronized (workThread) { workThread.notify(); } } }
ljzdyh 2015-01-16
  • 打赏
  • 举报
回复
淘宝的是做html的吧
baseball11 2014-08-19
  • 打赏
  • 举报
回复
主要考虑到OOM问题,图片稍微多一点必须使用异步网络加载,我用的是universal-image-loader,简单方便不用自己去操心
老科达 2014-08-19
  • 打赏
  • 举报
回复
第一次打开图片列表界面时,访问服务器,加载json字符串,里面包含了文字,和图片的ID或者图片的地址。然后解析json,每次解析出来一个图片的ID或者地址,就异步(或者多线程)向服务器发起请求,加载真正的图片(使用文件流)。 就是这种做法, 只不过是图片在本地做了缓存(并加上淘汰算法), 重复读取时直接使用本地缓存的数据,第一次读取远程图片那是必然的。 有个第三方工具 ImageLoader 很好的解决了图片加载的问题, 你可以参考。 其他的都是类似 只有在展示时候 才去加载图片。
她做了一个梦 2014-08-19
  • 打赏
  • 举报
回复
分页,上拉加载更多
pricks 2014-08-19
  • 打赏
  • 举报
回复
请问有谁能回答第3个问题

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧