android的部分优化

网络IO应该在哪种形式的线程中执行

  • 首先网络IO一般耗时比较长,有的可能到几十毫秒
  • 由于耗时较长,如果采用单一线程处理,势必导致后续的请求无法快速执行
  • 建议使用线程池来处理达到快速响应和线程的复用。

简单示例:

private void testDoNetworkRequest() {
    int corePoolSize = 5;
    int maxPoolSize = 10;
    //线程数量超过核心线程数之后的超时时间,即超过这个时间还没有新的task,多余的线程则销毁掉。
    long keepAliveTime = 10;
    ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());

    executor.execute(new Runnable() {
        @Override
        public void run() {
            //Do network IO here
        }
    });
}

如何优化字符串拼接

  • 字符串拼接无法避免的创建StringBuilder对象
  • 如果是循环情况下拼接,需要显式在循环外声明一个StringBuilder对象
不好的代码
public void  implicitUseStringBuilder(String[] values) {
  String result = "";
  for (int i = 0 ; i < values.length; i ++) {
      result += values[i];//create new StringBuilder object every time
  }
  System.out.println(result);
}
改进后的代码
public void explicitUseStringBuider(String[] values) {
  StringBuilder result = new StringBuilder();
  for (int i = 0; i < values.length; i ++) {
      result.append(values[i]);
  }
}

使用Handler到底需不需要使用弱引用,什么时候情况下用

  • 正常境况下的引用都为强引用,其特点是及时内存溢出也不可以被回收
ArrayList list = new ArrayList();
  • 弱引用则会在垃圾回收时被回收掉,因而弱引用解决内存泄露的一种方法。
ArrayList list = new ArrayList();
WeakReference<ArrayList> listWeakRef = new WeakReference<ArrayList>(list);
ArrayList myList = listWeakRef.get();
  • Handler是否需要设置弱引用,取决于它是否可能发生内存泄露
Handler内存泄露的场景
  • Message的target变量实际是Handler对象
  • Message存放在MessageQueue中
  • MessageQueue通常为Looper持有
  • Looper和可以认为和线程生命周期相同
  • 通常情况下,我们使用匿名内部类的形式创建Handler,而匿名内部类(非静态内部类)会隐式持有外部类的引用。即如下的mHandler会隐式持有Activity的实例引用。
private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
};
  • 如果有一个延迟很久的消息,可能会导致Activity内存泄露
  • 可以使用弱引用解决内存泄露问题
  • 也可以在Activity onDestory方法中调用handler.removeCallbacksAndMessages(null);

网络数据返回先通知界面还是先更新数据库

  • 通常境况下,可以选择先更新界面再更新数据库
  • 如果数据很重要,建议先更新数据库在通知界面更新

业务场景:需要定时后台扫描数据库,上传本地照片至云端,定时任务采用何种模式

  • Handler或者Timer定时一般为秒级别的任务,Timer会启动额外线程,而Handler可以不用。
  • 无论是Handler还是Timer都需要依赖于进程存活
  • 利用Handler实现定时任务的类: HandlerTimer
  • 如果时间较长,则需要使用AlarmManager
  • 另外,我们对于这种业务应该优先考虑是否可以基于事件通知。
  • 如果是加入媒体库的文件,我们可以使用registerContentObserver监听媒体库文件变化。

static 单例是怎么保证单例的?没太看明白

  • static变量为类所有
  • staitc只初始化一次,即在调用的时候。
  • 如下代码,STATIC_OBJECT只在第一次调用时初始化,后续调用则不会再执行初始化
public class Example {
    public static Object STATIC_OBJECT = new Object();
}
  • 使用static机制创建单例
public class SingleInstance {
    private SingleInstance() {
    }

    public static SingleInstance getInstance() {
        return SingleInstanceHolder.sInstance;
    }

    private static class SingleInstanceHolder {
        private static SingleInstance sInstance = new SingleInstance();
    }
}

把Activity作为参数传给一个静态方法,会影响这个Activity的正常销毁吗

  • 内存泄露与方法是否是静态与否无关,与内部的方法体实现有关系。
  • 内存泄露可以简单理解成:生命周期长的对象不正确持有了持有了生命周期短的对象,导致生命周期短的对象无法回收。
  • 比如Activity实例被Application对象持有,Activity实例被静态变量持有。

Bitmap优化

  • options.inJustDecodeBounds = true;可以获取width,height和mimetype等信息,但不会申请内存占用
  • 合理进行缩放,一个高分辨率的图片不仅展示在一个小的imageView中,不仅不会有任何视觉优势,反而还占用了很大的内存
  • 将Bitmap处理移除主线程
  • 使用LruCache或者DiskLruCache缓存Bitmap
  • before 2.3 手动调用recycle()方法

多次在生产签名打包后的apk,出现功能不可用的情况,比方说有个社会化分享功能,写代码时都可以正常实现,但签名生成apk后该功能无法再使用了,点击分享面板的平台,没有任何响应。请问是怎么回事,这种问题解决应该从哪几个方面入手,希望有一些思路可供参考

  • 应该是混淆引起的
  • 混淆是将易读性较好的变量,方法和类名替换成可读性较差的名称
  • 混淆的目的是为了加大逆向的成本,但不能避免
  • 通常混淆的处理是将某些库不加入混淆
  • 第三方的库不建议混淆
一些需要排除混淆的
  • 被native方法调用的java方法
  • 供javascript调用的java方法
  • 反射调用的方法
  • AndroidManifest中声明的组件
  • 总结:即所有硬编码的元素(变量,方法,类)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
森林防火应急联动指挥系统是一个集成了北斗定位/GPS、GIS、RS遥感、无线网络通讯、4G网络等技术的现代化智能系统,旨在提高森林火灾的预防和扑救效率。该系统通过实时监控、地图服务、历史数据管理、调度语音等功能,实现了现场指挥调度、语音呼叫通讯、远程监控、现场直播、救火人员生命检测等工作的网络化、智能化、可视化。它能够在火灾发生后迅速组网,确保现场与指挥中心的通信畅通,同时,系统支持快速部署,适应各种极端环境,保障信息的实时传输和历史数据的安全存储。 系统的设计遵循先进性、实用性、标准性、开放性、安全性、可靠性和扩展性原则,确保了技术的领先地位和未来的发展空间。系统架构包括应急终端、无线专网、应用联动应用和服务组件,以及安全审计模块,以确保用户合法性和数据安全性。部署方案灵活,能够根据现场需求快速搭建应急指挥平台,支持高并发视频直播和大容量数据存储。 智能终端设备具备三防等级,能够在恶劣环境下稳定工作,支持北斗+GPS双模定位,提供精确的位置信息。设备搭载的操作系统和处理器能够处理复杂的任务,如高清视频拍摄和数据传输。此外,设备还配备了多种传感器和接口,以适应不同的使用场景。 自适应无线网络是系统的关键组成部分,它基于认知无线电技术,能够根据环境变化动态调整通讯参数,优化通讯效果。网络支持点对点和点对多点的组网模式,具有低功耗、长距离覆盖、强抗干扰能力等特点,易于部署和维护。 系统的售后服务保障包括安装实施服务、系统维护服务、系统完善服务、培训服务等,确保用户能够高效使用系统。提供7*24小时的实时故障响应,以及定期的系统优化和维护,确保系统的稳定运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值