商城项目做了一年多,也维护了这么久,一直想对此总结一下,也让不熟悉的朋友了解一下,应用商城的一些技术难点

其实,开发应用商城,不外乎这么几点:

1: 异步加载app 信息列表, 主要是app的icon加载:

为了app列表滚动刷新流畅,引入了线程池的思想,网络端加载信息的动作都在线程池中进行

外码片段如下:

public class AsyncImageLoader3 {

//为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在ListView时来回滚动)

public Map> imageCache = new HashMap>();

private ExecutorService executorService = Executors.newFixedThreadPool(8); //固定五个线程来执行任务

private final Handler handler=new Handler();

/**

*

* @param imageUrl 图像url地址

* @param callback 回调接口

* @return 返回内存中缓存的图像,第一次加载返回null

*/

public Drawable loadDrawable(final String imageUrl, final ImageCallback callback) {

//如果缓存过就从缓存中取出数据

if (imageCache.containsKey(imageUrl)) {

SoftReference softReference = imageCache.get(imageUrl);

if (softReference.get() != null) {

return softReference.get();

}

}

//缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中

executorService.submit(new Runnable() {

public void run() {

try {

final Drawable drawable = Drawable.createFromStream(new URL(imageUrl).openStream(), "image.png");

imageCache.put(imageUrl, new SoftReference(drawable));

handler.post(new Runnable() {

public void run() {

callback.imageLoaded(drawable);

}

});

} catch (Exception e) {

throw new RuntimeException(e);

}

}

});

return null;

}

//从网络上取数据方法

protected Drawable loadImageFromUrl(String imageUrl) {

try {

return Drawable.createFromStream(new URL(imageUrl).openStream(), "image.png");

} catch (Exception e) {

throw new RuntimeException(e);

}

}

//对外界开放的回调接口

public interface ImageCallback {

//注意 此方法是用来设置目标对象的图像资源

public void imageLoaded(Drawable imageDrawable);

}

}

2:app的下载,主要技术点是多线程分段下载

为了加快apk的下载速度,一般网络下载都使用分段下载,将一个网络端文件分成几个小段,每段都由一个独立的线程去下载,然后把下载进程同步到主线程,显示进度, 下面是这一步的关键代码:

int range = fileSize / threadcount;

infos = new ArrayList();

for (int i = 0; i < threadcount - 1; i++) {

DownloadInfo info = new DownloadInfo(i, i * range, (i + 1)* range - 1, 0, urlstr);

infos.add(info);

}

DownloadInfo info = new DownloadInfo(threadcount - 1,(threadcount - 1) * range, fileSize - 1, 0, urlstr);

DownloadInfo 是每一段的信息,包括本段的大小,起止点offset,已经下载的字节数,等等

3:app下载的断点续传...

断点续传主要是用于暂停和下载两种状态的切换,这样保证了暂停下载后,数据有保存,下次接着download的时候 可以不用从0开始了。其实是数据库的思想,关键点就是下载的实时进度保存到数据库中

/**

* 更新数据库中的下载信息

*/

public boolean updataInfos(int threadId, int compeleteSize, String urlstr) {

synchronized (_writeLock){

try{

SQLiteDatabase database = dbHelper.getReadableDatabase();

String sql = "update download_info set compelete_size=? where thread_id=? and url=?";

Object[] bindArgs = { compeleteSize, threadId, urlstr };

database.execSQL(sql, bindArgs);

return true;

}catch(Exception e){

return false;

}

}

}

本步骤设计到数据库的知识,读者可自行网上找寻相关资料

4:还有一点容易被忽略的就是,应用当前的状态管理(下载中,等待中,暂停,安装,下载完成,安装中,已安装,卸载...,更新),

这一步看似无关紧要,却是我改bug最多的地方,需要在前期很好的规划管理才行!

状态的切换涉及到本地应用是否安装,是否是最新版,等等,比如一个应用已经在机器里面安装了,但是网络端有更新的版本,这时app列表里面这个应用的状态就是更新两个字,而如果这个应用未被安装,那么这个应用状态就是下载两个字,诸如此类...

还有一些在测试时比较极端的情况,比如在下载的过程中,在文件管理里面把下载的临时文件删掉,这个时候应用状态的处理等等...这些都是急需要注意的地方。如下是下载中的状态:

最后贴一张局部效果图吧,希望本文可以给需要的读者有所帮助:

如有疑问,本人(xw0326)愿意一起讨论解答:

android 商城开发,Android 应用商城开发的几个关键技术点相关推荐

  1. Android、IOS手机短视频拍摄、编辑的一些关键技术

    对于普通的视频拍摄,特别是对视频大小进行定制裁剪的,iOS对多媒体处理的支持还算比较丰富,Android原生Recorder类并不支持视频比例的设置. 视频的录制: a摒弃原生接口,使用FFmpeg或 ...

  2. 基于Andro平台的软件开发若干关键技术研究(笔记)

    基于Android平台的软件开发若干个关键技术研究 摘要:随着移动智能终端的飞速发展和广泛普及,移动GIS应用正迅速迅速成长,并且成为最有发展前景的热点之一.作为移动GIS应用的分支,基于Androi ...

  3. 【Android开发】网上商城

    [Android开发]网上商城 文章目录 [Android开发]网上商城 一.开发环境需求 二.系统功能设计 三.运行结果 1. 欢迎界面 2. 搜索界面 3. 登录界面 四.主要代码 1. Home ...

  4. 直播商城开发Android自定义可移动悬浮按钮

    在布局文件添加控件时可使用如下方式: <android.support.design.widget.FloatingActionButton......./> 也可使用自定义的包名: co ...

  5. android listview 自适应列宽_Android 开发技术周报 Issue#272

    新闻/News 谷歌Pixel 4a将采用UFS 2.1存储:可以体验全套GMS [图]Android端Play商城现全面开放深色主题 教程/Tutorial OkHttp Interceptor - ...

  6. 直播商城源码,商城开发实现商城底部导航栏

    直播商城源码,商城开发实现商城底部导航栏 1.先写布局. 我新建了一个ShoppingActivity,在activity_shopping.xml文件中,写整体布局,代码如下: <?xml v ...

  7. 巧用第三方快速开发Android App 热门第三方SDK及框架

    巧用第三方快速开发Android App 热门第三方SDK及框架 历经大半年的时间,终于是把这门课程给录制出来了,也就在今天,正式在慕课网上上线了 项目地址:巧用第三方快速开发Android App ...

  8. uniapp小程序商城开发thinkphp6积分商城、团购、秒杀 封装APP

    uniapp小程序商城开发thinkphp6积分商城.团购.秒杀 封装APP,后台是vue开发 需要源代码的可以联系我,找我要哦 <template><view v-if=" ...

  9. Android课程设计--网上购物商城

    Android的特征: 提供访问硬件的API函数,简化访问过程等 具有自己的运行时和虚拟机 提供了丰富的界面控件供使用者之间调用,加快用户界面的开发速度,保证Android平台上程序界面的一致性 提供 ...

  10. 个人开发android如何赚钱

    先说说本人的情况,09年底开始学习手机开发,先从Brew到Mobile再到Android,android是今年过年回来才算真正开始学的,一边学习一边做原先Brew项目到android的移植,5月中旬的 ...

最新文章

  1. 巨头垄断,Facebook直接封杀了一个国家!
  2. C#三层架构第九课之反射和工厂模式实现多数据库访问
  3. .NET中RabbitMQ的使用
  4. 前端学习(1318):同步api和异步api
  5. 网站性能Web压力测试工具webbench
  6. 中芯国际科创板上市发行价定为27.46元/股,募资或超500亿元
  7. 一辆车,一年大概要花费多少钱,除了油费?
  8. c语言中基本数据类型printf()对应格式
  9. c语言上机填空改错试题,2013年计算机二级C语言上机试题六十二及答案
  10. 开发经理是否应该写代码?​
  11. 【Gym-101908 B】Marbles【SG函数】
  12. kdj买卖指标公式源码_炒股秘籍——KDJ你所不知道的绝密用法(附指标公式源码)...
  13. Adapter 模式
  14. luogu 2184 贪婪大陆
  15. 英语思维导图大全 介词(七)
  16. java折线图_如何用java 画折线图
  17. Geek ? 什么是 Geek ? 谁是 Geek ?
  18. html游戏转wxw,wf.html · wxw婉/flowChart - Gitee.com
  19. teamviewer存在linux版本_Ubuntu16.04 安装Teamviewer
  20. IEO大溃败进行时 |链捕手

热门文章

  1. 深入了解宽带路由器共享上网原理
  2. 学Linux选择什么系统比较好?
  3. bxl类型封装怎么转换为AD库封装
  4. 织梦插件-全自动SEO织梦插件
  5. Python之,评委打分。A~F六位参赛选手,去除最高与最低分之后的的评分为…
  6. [JSOI] 快递服务 [SHOI] 书柜的尺寸 优化dp
  7. 【点宽专栏】国信证券——关于量化选股之聚类分析的探讨
  8. frp点对点udp方式内网穿透ssh,不走服务器流量
  9. 深入探讨:linux中遍历文件夹下的所有文件
  10. c语言数据类型习题,C语言-数据类型习题及答案.doc