精华内容
下载资源
问答
  • 上篇博客讲到如何获取手机中所有歌曲的信息。本文就把上篇获取到的歌曲按照歌手名字分类。用一个ExpandableListView显示出来。 MainActivity .java public class Ma...

     

    上篇博客讲到如何获取手机中所有歌曲的信息。本文就把上篇获取到的歌曲按照歌手名字分类。用一个ExpandableListView显示出来。

                                                                                 MainActivity .java

    1.  
      public class MainActivity extends AppCompatActivity {
    2.  
      private static List<MusicLoader.MusicInfo> musicList = new ArrayList<MusicLoader.MusicInfo>();
    3.  
      private ExpandableListView groupLvSongs;
    4.  
       
    5.  
      @Override
    6.  
      protected void onCreate(Bundle savedInstanceState) {
    7.  
      super.onCreate(savedInstanceState);
    8.  
      setContentView(R.layout.activity_main);
    9.  
      initView();
    10.  
      initEvent();
    11.  
      }
    12.  
       
    13.  
      private void initEvent() {
    14.  
      // 这是获取musicList,与本篇博客主题无关,大家只需要知道musicList代表所有歌曲,它的每一项都包含一首歌的所有信息
    15.  
      musicList = MusicLoader.instance(getContentResolver()).getMusicList();
    16.  
      // 设置适配器,给listview提供数据
    17.  
      groupLvSongs.setAdapter(new myExadapter(MainActivity.this, musicList));
    18.  
      }
    19.  
       
    20.  
      private void initView() {
    21.  
      groupLvSongs = (ExpandableListView) findViewById(R.id.groupLvSongs);
    22.  
      }
    23.  
       
    24.  
      /**
    25.  
      * 按歌手分类的listview 对应的Adapter,自定义ExpandableListView的适配器
    26.  
      * getGroupId()getChildId()hasStableIds()isChildSelectable暂时都默认自动生成的,
    27.  
      * 最主要是getGroupView(),getChildView()方法
    28.  
      */
    29.  
      class myExadapter extends BaseExpandableListAdapter {
    30.  
       
    31.  
      //在获取view的时候需要context
    32.  
      private Context context;
    33.  
      //所有歌曲
    34.  
      private List<MusicInfo> musicList = new ArrayList<MusicInfo>();
    35.  
      //记录各个歌手名字
    36.  
      private List<String> groupName = new ArrayList<String>();
    37.  
      //按歌手名字分类后的所有歌曲
    38.  
      private List<List<MusicInfo>> musicGroupBySinger = new ArrayList<List<MusicInfo>>();
    39.  
       
    40.  
      myExadapter(Context context, List<MusicInfo> group) {
    41.  
      this.context = context;
    42.  
      musicList = group;
    43.  
       
    44.  
      sortByArtistName();
    45.  
      }
    46.  
       
    47.  
      // 根据歌手分类最终获得 musicGroupBySinger
    48.  
      private void sortByArtistName() {
    49.  
      // 第一个特殊
    50.  
      groupName.add(musicList.get(0).getArtist());
    51.  
      List<MusicInfo> musicListWithSameSinger = new ArrayList<MusicInfo>();
    52.  
      musicListWithSameSinger.add(musicList.get(0));
    53.  
      musicGroupBySinger.add(musicListWithSameSinger);
    54.  
      for (int i = 1; i < musicList.size(); i++) {
    55.  
      boolean flag = false;
    56.  
      for (int j = 0; j < groupName.size(); j++) {
    57.  
      // if该歌手名字已经存在
    58.  
      if (musicList.get(i).getArtist().equals(groupName.get(j))) {
    59.  
      flag = true;
    60.  
      musicGroupBySinger.get(j).add(musicList.get(i));
    61.  
      break;
    62.  
      }
    63.  
      }
    64.  
      if (!flag) {
    65.  
      groupName.add(musicList.get(i).getArtist());
    66.  
      List<MusicInfo> musicListWithSameSinger2 = new ArrayList<MusicInfo>();
    67.  
      musicListWithSameSinger2.add(musicList.get(i));
    68.  
      musicGroupBySinger.add(musicListWithSameSinger2);
    69.  
      }
    70.  
      }
    71.  
      }
    72.  
       
    73.  
      @Override
    74.  
      public int getGroupCount() {
    75.  
      return musicGroupBySinger.size();
    76.  
      }
    77.  
       
    78.  
      @Override
    79.  
      public int getChildrenCount(int groupPosition) {
    80.  
      return musicGroupBySinger.get(groupPosition).size();
    81.  
      }
    82.  
       
    83.  
      @Override
    84.  
      public Object getGroup(int groupPosition) {
    85.  
      return musicGroupBySinger.get(groupPosition);
    86.  
      }
    87.  
       
    88.  
      @Override
    89.  
      public Object getChild(int groupPosition, int childPosition) {
    90.  
      return musicGroupBySinger.get(groupPosition).get(childPosition);
    91.  
      }
    92.  
       
    93.  
      @Override
    94.  
      public long getGroupId(int groupPosition) {
    95.  
      return 0;
    96.  
      }
    97.  
       
    98.  
      @Override
    99.  
      public long getChildId(int groupPosition, int childPosition) {
    100.  
      return 0;
    101.  
      }
    102.  
       
    103.  
      //true还是false感觉没什么区别
    104.  
      @Override
    105.  
      public boolean hasStableIds() {
    106.  
      return false;
    107.  
      }
    108.  
       
    109.  
      //获取Group的视图
    110.  
      @Override
    111.  
      public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    112.  
       
    113.  
      if (convertView == null) {
    114.  
      LayoutInflater inflater = LayoutInflater.from(context);
    115.  
      // R.layout.groups这个参数是group的视图
    116.  
      convertView = inflater.inflate(R.layout.groups, null);
    117.  
      }
    118.  
       
    119.  
      TextView title = (TextView) convertView.findViewById(R.id.tvSinger);
    120.  
      title.setText(groupName.get(groupPosition));// 设置大组成员名称
    121.  
       
    122.  
      return convertView;
    123.  
      }
    124.  
      //获取展开的子视图
    125.  
       
    126.  
      /**
    127.  
      * 在这里我有必要提一下listview加载视图的优化问题
    128.  
      * <p/>
    129.  
      * 一、复用convertView
    130.  
      * 首先讲下ListView的原理:ListView中的每一个Item显示都需要Adapter调用一次getView的方法,这个方法会传入一个convertView的参数,
    131.  
      * 返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存,
    132.  
      * 创建View对象(mInflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)也是耗时操作,所以必将影响性能。
    133.  
      * Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,
    134.  
      * 相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View,所以说如果能重用这个convertView,
    135.  
      * 就会大大改善性能。
    136.  
      * 所以getChildView 一开始会有一个判断语句
    137.  
      * if (convertView == null) 如果不为空就直接使用之前那个。
    138.  
      * <p/>
    139.  
      * <p/>
    140.  
      * 二、使用viewHolder类
    141.  
      * 我们都知道在getView方法中的操作是这样的:
    142.  
      * 先从xml中创建view对象(inflate操作,我们采用了重用convertView方法优化),然后在这个view去findViewById,
    143.  
      * 找到每一个子View,如:一个TextView等。这里的findViewById操作是一个树查找过程,也是一个耗时的操作,所以这里也需要优化,
    144.  
      * 就是使用viewHolder,把每一个子View都放在Holder中,当第一次创建convertView对象时,把这些子view找出来。
    145.  
      * 然后用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。
    146.  
      * 当第二次重用convertView时,只需从convertView中getTag取出来就可以。
    147.  
      */
    148.  
      @Override
    149.  
      public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    150.  
      int position = musicList.indexOf(getChild(groupPosition,
    151.  
      childPosition));
    152.  
      // 优化listView
    153.  
      ViewHolder viewHolder;
    154.  
      if (convertView == null) {
    155.  
      // R.layout.music_item是每一项的视图xml文件
    156.  
      convertView = LayoutInflater.from(MainActivity.this).inflate(
    157.  
      R.layout.music_item, null);
    158.  
       
    159.  
      TextView pTitle = (TextView) convertView
    160.  
      .findViewById(R.id.title);
    161.  
      viewHolder = new ViewHolder(pTitle);
    162.  
      // 用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。
    163.  
      convertView.setTag(viewHolder);
    164.  
      } else {
    165.  
      // 当第二次重用convertView时,只需从convertView中getTag取出来就可以。
    166.  
      viewHolder = (ViewHolder) convertView.getTag();
    167.  
      }
    168.  
      viewHolder.title.setText(musicList.get(position).getTitle());
    169.  
      return convertView;
    170.  
      }
    171.  
       
    172.  
      @Override
    173.  
      public boolean isChildSelectable(int groupPosition, int childPosition) {
    174.  
      return false;
    175.  
      }
    176.  
      }
    177.  
       
    178.  
      class ViewHolder {
    179.  
      TextView title;
    180.  
       
    181.  
      public ViewHolder(TextView pTitle) {
    182.  
      title = pTitle;
    183.  
      }
    184.  
      }
    185.  
      }
    186.  
       
    187.  
       

     成果展示:

     

     

     



     

    转载于:https://www.cnblogs.com/xgjblog/p/9681776.html

    展开全文
  • 但后来了解到,他打开程序,手机内存就被占了2M。这就比较离谱了。我的手机打开程序时,占内存大约600多K。事后,我联系了一些论坛的朋友,了解到,可能是手机ROM字段的支持库的版本问题。 建议大家,安装NETCF3.5...

        很多朋友反映软件占内存。这到不可否认,毕竟是应有软件,界面多,数据载入量大,和工具软件部能比的。但后来了解到,他打开程序,手机内存就被占了2M。这就比较离谱了。我的手机打开程序时,占内存大约600多K。事后,我联系了一些论坛的朋友,了解到,可能是手机ROM字段的支持库的版本问题。
     
         建议大家,安装NETCF3.5(WM6.5自带,不需要安装)。NETCF3.5微软出品, 至于快不快,大家自己体会。高效的性能诊断和分析工具以及很多的小改进。可以提高.net程序的运行速度,wm5能提高40,wm6能提高20。
     
     下载链接为:http://sj.skycn.com/e/350/8/8370/    

    展开全文
  • 如果把手机内存和CPU想象成固定面积的田地,单个应用对内存和CPU的占用则可比喻为个人的一亩三分地儿。当应用内存和CPU占用过高时,便过多占用了整个田地资源,挤压了邻家应用的面积,那么手机能够同时运行的应用的...
        

    如果把手机内存和CPU想象成固定面积的田地,单个应用对内存和CPU的占用则可比喻为个人的一亩三分地儿。当应用内存和CPU占用过高时,便过多占用了整个田地资源,挤压了邻家应用的面积,那么手机能够同时运行的应用的数量就会相应减少。

    应用过度消耗手机的内存和CPU将会导致手机卡顿、延迟、甚至崩溃等现象频发,严重影响用户体验。

    本次华为DevEco云测平台提供了一套专业的测试方法及解决方案,对具有代表性的几款视频类应用在不同使用场景下消耗手机内存和CPU的情况进行检测。

    1、测试环境

    测试平台:DevEco云测平台

    https://deveco.huawei.com/

    测试对象:腾讯视频6.2.2.17134、爱奇艺9.7.0、优酷7.3.8、搜狐视频6.9.9、乐视视频8.0、芒果TV5.8.6 华为应用市场可下载版本。

    测试环境

    硬件环境:华为P20 6G+64G

    软件版本:基于Android 版本8.1 EMUI

    测试步骤

    1. 登陆DevEco-> 测试服务->性能测试。

    2.创建任务界面:测试介绍->机型选择,选择P20->测试配置,上传应用并配置账户登陆信息->提交。

    2、测试方法

    1.内存测试

    建议达到标准

    应用前台内存占用 <= 500MB;
    应用后台内存占用(亮/灭屏)<= 400MB。

    测试方法

    通过反射调用android.app.ActivityManagerNative里面的getProcessMemoryInfo方法,获取应用的PSS(应用使用内存)使用情况:appMemoryInfos[0]。

    如下图,以com.tencent.qqlive为例:

    image

    2.CPU测试

    建议达到标准:

    应用后台CPU占用(亮/灭屏)<=2%

    测试方法:

    第一步:记录初始时CPU使用情况

    测试开始时,通过读取/proc/进程pid/stat,获得进程的CPU统计信息:

    当前后台运行应用占用CPU时间:AppT0=cpuInfos[13]+ cpuInfos[14]。

    通过读取/proc/stat,获取整个系统的CPU占用率,结果如下:

    TotalT0= cpuInfos[1] + cpuInfos[2] + cpuInfos[3] + cpuInfos[4] + cpuInfos[6]+ cpuInfos[5] + cpuInfos[7]

    第二步:记录结束时CPU使用情况

    测试结束时,通过读取/proc/进程pid/stat,获得进程的CPU统计信息:

    当前后台运行应用占用CPU时间:AppT1=cpuInfos[13]+ cpuInfos[14]

    通过读取/proc/stat,获取整个系统的CPU占用率,结果如下:

    TotalT1= cpuInfos[1] + cpuInfos[2] + cpuInfos[3] + cpuInfos[4] + cpuInfos[6]+ cpuInfos[5] + cpuInfos[7]

    计算公式:

    cpuRate = (AppT1-AppT0)/(TotalT1- TotalT0)

    *异常情况:排除AppT1-AppT0小于0,CPU使用率为0的情况。

    如下图,以com.tencent.qqlive为例:

    image

    3、测试结果对比

    1.视频类应用内存占用对比 (前台)

    通过对比各应用最新版本在同一设备中的前台内存占用数据,可以清晰的呈现出各应用内存占用情况。

    由图一可见,六款视频应用均表现良好,符合测试标准(<500MB)。其中,乐视视频和搜狐视频表现最优,内存占用远低于标准线。

    2.视频类应用内存占用对比 (后台)

    图二是视频类应用最新版本在手机后台亮/灭屏情况下内存占用情况。

    六款视频类应用后台内存占用均低于标准线(<400MB),性能表现良好,其中搜狐视频后台内存占用最低。

    image

    3.视频类应用CPU占用对比 (后台)

    图三是视频类应用最新版本亮/灭屏CPU占用情况,搜狐新闻、腾新视频、优酷视频、爱奇艺的CPU占用率较低,性能良好。

    乐视视频和芒果TV两个应用的CPU占用过高,超过绿色达标线一倍多,需引起开发者重视。

    image

    总结:

    通过以上的数据对比,六款主流视频应用的内存占用均位于绿色标准线以内,表现良好;而在CPU后台占用中,乐视视频、芒果TV CPU占用则远高于绿色标准线,占用过高将对用户体验造成不良影响。

    内存和CPU的占用所导致的手机延迟、卡顿甚至是崩溃等现象,对视频类应用的用户体验影响是非常直接的,因此也与用户的留存和活跃度息息相关。希望开发者们予以重视,将应用内存和CPU的占用保持在绿色达标线以内,华为终端开放实验室也将与开发者一起为打造绿色健康的安卓生态不懈努力。

    4、高内存和CPU占用原因分析

    应用内存和CPU占用过高会严重影响用户体验,那么造成这种现象的根本原因是什么?

    1.高内存占用原因:

    1)内存泄漏是引发应用内存问题的主要原因,长时间内存泄漏会占用大量内存。常见的内存泄漏如:Context泄漏(Activity传递泄漏、context未使用applicationContext),Handle泄漏(在handler中持有context等做耗时操作),Cursor泄漏(使用完cursor后未关闭),register后未unregister等。

    2)复杂的界面布局,过多的view层级,也会占用大量的内存。

    3)使用传统的Java API中提供的HashMap工具类会相对比较低效,也会占用过多的内存。

    2.高CPU占用原因:

    1)网络请求过多,导致持续占用CPU。

    2)存在特殊的布局或者特殊操作(GPS等需要一直刷新的服务),特殊加载(图片、视频、音频等)。

    3)有过多的图表、曲线图等绘制操作。

    4)大量的图片、视频处理、加载货布局操作。

    5、优化建议

    针对通过DevEco云测平台测试发现内存、CPU占用超标、过高的现象,建议开发者从以下几方面对内存和CPU占用进行优化:

    1.内存占用优化建议:

    尽可能设置视图为不透明;
    不要阻塞主进程;
    避免重复处理数据;
    选择正确的数据格式;
    数据结构优化;
    对象复用;
    避免内存泄漏。

    2.CPU占用优化建议:

    大量图片、音频、视频处理最好使用JNI技术来实现;
    传输完数据就将线程关闭,立即释放资源,不要让线程在一直空转等待下次数据的传输。

    展开全文
  • 大家有没有留意iPhone在使用一段时间后发现手机剩余存储空间减少了很多。如何查看?点开“设置”>“通用”>“iPhone储存空间”,可以查看到手机储存空间各个项目占用空间的比例以及大小。储存空间各项目占用...

    大家有没有留意iPhone在使用一段时间后发现手机剩余存储空间减少了很多。

    如何查看?点开“设置”>“通用”>“iPhone储存空间”,可以查看到手机储存空间各个项目占用空间的比例以及大小。

    9d00e6fef31c656b6391bce2986f696b.png

    储存空间各项目占用比例

    e0d842d57a1955838dadeddac19d2f93.png

    页面的最下方有“其他”一项占用比较大

    3ed3bc42d6e39ddb65d200c1963ae49c.png

    其他系统数据:包括缓存、日志和其他资源

    iPhone 储存空间中的“其他”类别占用较多。笔者了解到“其他”类别中包含不可移除的移动资源,例如 Siri 语音、字体、词典、不可移除的日志和缓存、聚焦索引和系统数据(例如,钥匙串和 CloudKit 数据库),以及系统无法删除缓存的文件。

    那么我们如何释放iPhone上的储存空间呢?感兴趣的网友可以尝试以下操作步骤:

    • 确保更新iPhone系统至最新版本。(重要:更新系统前记得备份iPhone)
    • 尝试按照建议来优化储存空间:您的设备可能会在“设置”>“iPhone 储存空间”部分中提供优化储存空间的建议,轻点“全部显示”即可查看针对您的设备给出的所有建议。
    • 前往“设置”>“通用”>“还原”,轻点“还原所有设置”。iPhone将重新启动,所有设置将会被移除,但不会抹除任何数据和媒体。
    • 如果“其他”类别依然占比较多,请备份您手机中重要数据,然后将 iPhone 恢复为出厂设置。
    • 重要:恢复 iPhone 将删除手机上所有内容和设置,建议您在恢复前一定要执行备份操作。
    76b8b04bf2c257bc50397d5dda62e9d5.png
    3621d6caecbcd213083edae7dbf26266.png

    如何查看iPad 和 iPod touch上的储存空间,与iPhone的步骤类似,如果以上操作未能解决大家的问题,可以联系Apple支持来获得更多协助。请点击以下链接,选择“iPhone、iPad 和 iPod touch”:https://getsupport.apple.com

    展开全文
  • 不让过多应用在后台自启很多手机卡顿的原因就是运行内存不足,而运行内存不足的原因是因为应用在后台偷偷启动。所以我们要减少应用自启的数量,这样才能操持手机流畅,不过微信、qq等需要保留...
  • Android的内存分配和管理为两个大板块: (Android手机...-如何减少Android 应用内存的占用: 1、Android 系统的低内存工作机制: 首先给大家提出一个问题,为什么有的手机打开应用多了,在使用的时候回特别卡呢。...
  • (目前手机拍摄的图片一张几M,上传后不压缩,如果几十张一块加载展示时内存画面有点美) 下载大量图片时一定要注意内存问题。 N多张图直接快爆掉: 如何破呢? 1 上传时除了需要特别高清以外的图适当压缩; 2...
  • apk的大小对于下载apk应用的用户多少有直接的影响,由于手机内存的限制和网络环境的限制,同一个应用随着apk越大下载的和使用的人数就会越少,所以减少apk的大小是非常重要的。本文从apk编译过程,apk的组成,apk...
  • 如何提升工作效率

    2018-12-05 16:53:56
    手机置为静音或者放置在柜子里,戒除手机上瘾。 定时打开邮箱收邮件,而不是每一封邮件都有提醒。 关闭及时工具软件的消息提醒功能。 2.减少多任务的切换。 尽量不要再多个任务间来回切换,专注于做一件事情。如果...
  • 如何做好手机站,以及有哪些注意事项,以下文章将详细讲述: 1、优化加载速度,减少流量消耗。 移动端用户在使用移动网站时,更多的是利用碎片化时间,除此之外,并不是所有用户都能时刻保持良好的手机网络环境。 ...
  • 1. 清理后台运行程序一般出现这个问题多是因为手机运行内存不足导致的,我们可以通过清理手机后台运行的程序,减少占用的手机运行内存,这样就可以打开你需要的应用程序了。2. 清理应用程序缓存应用程序在使用的过程...
  • 是不是经常点了无数次清楚内存,手机还是卡的的像疯子一样? 明明满电出门,还没走出小区,电量就少了15%?...减少手机耗电量! 第一:激活开发人员选项首先【设置】【关于手机】【版本号】连续点5次以上,提...
  • 3.2.3.使用ViewStub控件 使用懒加载布局ViewStub,在需要时再对View进行inflate操作, 减少内存的占用; 可参考Demo: View优化_使用ViewStub. 使用场景: 如小米手机的添加联系人界面: ...
  • PDF文件太大,占用的电脑或手机内存就多,无论是发邮件,还是传输起来都特别慢...那么如何减少PDF文件大小呢?下面分享2个PDF压缩技巧,有需要的朋友看过来吧。一、PDF在线转换器1、直接搜索并打开PDF365.cn的网站...
  • 制作背景:公司项目需要最大限度减少前端图片占用内存量(PC端+手机端图片占用总大小 Icon-font的优点: Ø 纯色图片改成icon-font图标字体可以像操作文字那样操作图片; Ø 基于SVG图片,放大后图片不失真; ...
  • 一、减少电脑后台程序电脑和手机也是差不多的,有些软件在关闭之后并没有真正的退出,而是在后台偷偷的运行,这样也是占电脑内存,这样会导致电脑变得越来有越卡,所以直接调出任务管理器,点击【结束任务】就可了...
  • 手机应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存,这篇文章将设计一个本地缓存的机制。 功能需求 这个缓存...
  • 随着智能手机的发展,现在几乎人手一部,有的人甚至有几部手机,但是使用一段时间总会出现各种问题,而刷机所需的线刷包却让人很头疼,大多都被内置了大量推广应用软件,有的被植入系统层无法卸载,让人很是恼火。...
  •  三星新版手机(从三星600新版开始)所支持的测试指令减少了很多,基本上就只余下以下几个可以成功的: 1 E! Y5 k+ C, `. m  *2767*2878#(EEPROM复位) / W, g' u- K( N% t  *2767*3855#(EEPROM总复位,IMEI有...
  • 导读:如何打造一个大中型的网络应用(包括IOS/Android手机客户端APP软件)?如何建设大中型网站?如何缓解数据库的压力?本文介绍分布式内存对象缓存系统Memcache的安装。 Memcached 是一个高性能的分布式内存...
  • 我们在使用cocos在windows平台下,运行速度很快很流畅,很强大,可是当我们打包成apk文件,在手机上运行的时候,流畅度很可能降低,甚至还有间歇性内存彪高。...在这里我们着重分析一下如何由图片减少内...
  • 1. 有个每秒钟5k个请求,查询手机号所属地的笔试题(记得不完整,没列出),如何设计算法?请求再多,比如5w,如何设计整个系统? 2. 高并发情况下,我们系统是如何支撑大量的请求的?  1,尽量使用缓存,包括用户缓存...
  • 本文主要讲述实现以及Fragment切换之间如何优化,减少内存的开销,相信不少朋友吃过Fragment生命周期的亏。话不多说,切入正题。 1、结合ToolBarTabLayout+ViewPager+Fragment实现的底部导航功能 效果 与 分析 ...
  • 我们Application除了作为入口类初始化一些操作,还... 从网络上获取的临时数据,为节约流量,减少用户等待时间,想暂时放在内存中供下次使用,如logo,商品图片等。 容易因频繁分配内存而导致内存泄漏的对象,如Han

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

如何减少手机内存