[项目总结]应用市场app

来源:互联网 发布:路由器密码查询软件 编辑:程序博客网 时间:2024/05/08 15:22

项目简介

这是一款下载应用和游戏的软件。具备用户登录,应用包管理,检查更新,设置,查看应用和游戏详情等主要功能。

项目实现过程

  • 封装BaseActivity,记录当前打开的Activity,配合一键退出应用(两种方法:1:调用finish所有activity的方法,2:发送广播finish所有activity)
  • ActionBar+DrawerLayout
    • ActionBar添加搜索按键,返回按钮的处理
    • 主界面actionBar 上添加控制抽屉的开关
    • DrawerLayout使用ActionBarDrawerToggle和actionBar关联
  • ViewPager+PagerTabStrip
    • ViewPager实用自带的PagerTabStrip实现、首页、应用、游戏、专题、分类、排行页面
  • ViewPager+Fragment
    • 封装BaseFragment,SwipeRefreshLayout下拉刷新,制定子类要实现的方法
    • FragmentFactory,把Fragment存放到集合,复用
  • 封装LoadingPager,app的显示框架
    • 四种界面: 加载中, 加载错误,加载为空 ,加载成功
    • 根据不同的状态去切换界面
    • ViewPager默认加载3页的关系,复用LoadingPager
  • 封装BaseProtocol,访问服务器加载页面的数据,把数据缓存到本地,复用本地缓存框架
  • 加载成功界面的显示
    • listView的使用
    • 应用界面listView头部添加一个轮播图View
    • SwipeRefreshLayout下拉刷新,listView底部加载更多
  • listView的优化
    • 封装listView的adapter(DefaultAdapter),listView的adapter的框架
    • adapter的优化,Viewholder的复用
    • 快速滑动的时候不加载图片
  • 封装BaseHolder,以BaseHolder为模块显示
  • 应用和游戏详情界面的实现,继承BaseHolder以模块显示组成界面
    • 使用值动画对应用是否安全和应用简介模块显示或收起
  • 用户登录模块,继承BaseProtocol请求数据,继承BaseHolder以模块显示
  • 排行页面
    • 自定义View实现不规则textView的摆放
  • 设置界面的实现
    • 是否自动更新功能
    • 同时下载任务数量功能
  • 安装包管理界面的实现
    • listView显示当前应用下载的安装包
    • 点击listView条目跳转安装
    • 长按listView条目,弹出批量删除选项
  • 检查更新的实现
    • popupWindow友好提示
    • Dialog显示更新详情和版本
  • 关于模块的实现Dialog显示详情和版本
  • 下载应用和游戏模块的实现,主页面点击下载后显示自定义进度条
    • 使用观察者设计模式实现,主界面和应用详情页的下载进度,暂停,等待下载,下载失败,下载完成的统一
    • 线程池的使用,供整个app耗时操作使用,结合设置模块控制同时下载任务数量功能

项目的特点和使用到的开源library

  • app框架的设计
  • java面向对象的特点,类的封装
  • listView不同的条目的复用
  • 使用的设计模式
    • 工厂设计模式
    • 单例设计模式(主要是懒汉式)
    • 观察者设计模式
  • 开源library:xUtils

项目遇到的问题

  • 由于ViewPager默认加载3页面,在复用LoadingPager时报了个illegalstateexception(The specified child already has a parent)异常,原因就是由于使用FragmentFactory缓存了Fragment,导致ViewPager回收页面时Fragment并没有销毁,当再次加载被回收的页面时,复用了Fragment,但此时Fragment里的LoadingPager已经存在父View,导致程序崩了。
    • 解决方法就是移除 LoadingPager之前的父View
public static void removeParent(View v){        //  先找到父View 再通过父View去移除孩子        ViewParent parent = v.getParent();        //所有的控件 都有父View  父View一般情况下 就是ViewGoup        if(parent instanceof ViewGroup){            ViewGroup group=(ViewGroup) parent;            group.removeView(v);        }    }
  • listView不同的条目的复用
    • 由于一开始只是根据position和datas.size()+1判断复用条目,但这样只是复用一个条目,并没有真正复用不同的条目,并且可能会出现一些未知的bug
    • 解决方法:根据Google官文档,复写两个方法,原理就是分配两个公共内存,根据不同标记复用:
  //返回不同条目类型    @Override    public int getItemViewType(int position) {        ...        return getInnerItemViewType(position);    }    //添加复用的listView条目    @Override    public int getViewTypeCount() {        return super.getViewTypeCount() + 1;    }
  • listView的复用导致主页面数据错乱
    • 解决方法:主页面的下载进度,暂停等状态是根据被观察者回调刷新界面的,而每个listView的条目的数据都带有一个ID,根据被观察者回调传的数据判断是否和listView的条目的数据ID是否同一个刷新界面

项目部分图片:
这里写图片描述这里写图片描述

项目地址:https://github.com/bullWing/ApplicationsPaly

0 0
原创粉丝点击