Android性能优化方案

Android性能优化有以下一个方面:

ANR,内存溢出,内存抖动,内存泄漏,UI卡顿,冷启动优化等方面来回答

1.ANR

  • 主线程被io操作阻塞(4.0后网络io不允许主线程中)。
  • 主线程做了耗时任务超过 5秒。
  • Service做了耗时操作超过20秒,这是由于service默认执行在主线程,可以使用IntentService 。
  • BroadcastReceiver的onReciver做了耗时操作超过10秒。

解决方式:

  • 开一个子线程,使用Handler来处理。
  • 使用AsyncTask来处理耗时任务。

2.内存溢出

内存溢出主要是由于加载大的图片引起的。解决方式:

  1. 及时释放bitmap,调用.recycler(Bitmap会占用java内存和c(native)内存,java内存会自动释放,c内存需要手动释放)。
  2. 使用lru 最近最少使用
    LruCache来存储对象put(key,value),,使用的使用LinkHashMap()。
  3. 计算inSampleSize
    官方提供的方法,使用BitmapFactory.Options来计算inSampleSize(图片的缩略比)
  4. 缩略图
    使用Options的inJustDecodeBounds属性来处理加载缩略图
  5. 三级缓存
    内存,本地,网络。

3.内存泄露

内存泄漏是指无用对象(不在使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄漏。

(1)单例导致内存泄漏

public class SingleInstanceTest { 
    private static SingleInstanceTest sInstance; 
    private Context mContext; 
    private SingleInstanceTest(Context context){ 
            this.mContext = context; 
    } 
    public static SingleInstanceTest newInstance(Context context){ 
            if(sInstance == null){ 
                sInstance = new SingleInstanceTest(context); 
            } return sInstance; 
    } 
}

上面是一个比较简单的单例模式用法,需要外部传入一个 Context 来获取该类的实例,如果此时传入的 Context 是 Activity 的话,此时单例就有持有该 Activity 的强引用(直到整个应用生命周期结束)。这样的话,即使该 Activity 退出,该 Activity 的内存也不会被回收,这样就造成了内存泄露,特别是一些比较大的 Activity,甚至还会导致 OOM(Out Of Memory)。

解决方式:

public class SingleInstanceTest { 
    private static SingleInstanceTest sInstance; 
    private Context mContext; 
    private SingleInstanceTest(Context context){ 
            his.mContext = context.getApplicationContext();
    } 
    public static SingleInstanceTest newInstance(Context context){ 
            if(sInstance == null){ 
                sInstance = new SingleInstanceTest(context); 
            } return sInstance; 
    } 
}

(2)内部类导致内存泄漏

非静态内部类会默认持有外部类的引用。会导致内部类的生命周期过长。
正确的做法就是修改成静态内部类。

(3)Handler
看下面的代码

 

public class HandlerActivity extends AppCompatActivity {
    private final static int MESSAGECODE = 1 ;
    private final Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.d("mmmmmmmm" , "handler " + msg.what ) ;
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler);
        //点击结束Activity
        findViewById( R.id.finish ).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
         //新建线程,内部类
        new Thread(new Runnable() {
            @Override
            public void run() {
                handler.sendEmptyMessage( MESSAGECODE ) ;
                try {
                    Thread.sleep( 8000 );
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //持有对象的引用
                handler.sendEmptyMessage( MESSAGECODE ) ;
            }
        }).start() ;
    }
}

这段代码运行起来后,立即点击 finish 按钮,通过检测,发现 HandlerActivity 出现了内存泄漏。

当Activity finish后,延时消息会继续存在主线程消息队列中8秒钟,然后处理消息。而该消息引用了Activity的Handler对象,然后这个Handler又引用了这个Activity。这些引用对象会保持到该消息被处理完,这样就导致该Activity对象无法被回收,从而导致了上面说的 Activity泄露。

Handler 是个很常用也很有用的类,异步,线程安全等等。如果有下面这样的代码,会发生什么呢? handler.postDeslayed ,假设 delay 时间是几个小时… 这意味着什么?意味着只要 handler 的消息还没有被处理结束,它就一直存活着,包含它的 Activity 就跟着活着。

我们来想办法修复它,修复的方案是 WeakReference ,也就是所谓的弱引用。垃圾回收器在回收的时候,是会忽视掉弱引用的,所以包含它的 Activity 会被正常清理掉。

解决方式
1.静态内部类
2.弱引用
3.注意在onDestroy中移除消息

public class HandlerActivity extends AppCompatActivity {
    private final static int MESSAGECODE = 1 ;
    private static Handler handler ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handler);
        findViewById( R.id.finish ).setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        //创建Handler
        handler = new MyHandler( this ) ;
        //创建线程并且启动线程
        new Thread( new MyRunnable() ).start();
    }
    private static class MyHandler extends Handler {
        WeakReference<HandlerActivity> weakReference ;
      public MyHandler(HandlerActivity activity ){
            weakReference  = new WeakReference<HandlerActivity>( activity) ;
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if ( weakReference.get() != null ){
                // update android ui
                Log.d("mmmmmmmm" , "handler " + msg.what ) ;
            }
        }
    }
    private static class MyRunnable implements Runnable {
        @Override
        public void run() {
            handler.sendEmptyMessage( MESSAGECODE ) ;
            try {
                Thread.sleep( 8000 );
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            handler.sendEmptyMessage( MESSAGECODE ) ;
        }
    }
}

 

4.UI卡顿

  1. 在UI线程中做轻微耗时操作,会导致UI线程卡顿
  2. 布局Layout过于复杂,无法再16ms内完成渲染
    60fps-->16ms
    60ms一帧 每过16ms就会更新一下ui,要达到60ms一帧,否则可能会卡顿
  3. 同一时间动画执行的次数过多,导致cpu或gpu负载过重。
  4. View过度绘制,导致某些像素在同一时间内被绘制多次,从而导致cpu,gpu负载过重。
    overdraw
    过度绘制,
  5. view频繁的触发measure。layout,导致measure。layout累计耗时过多以及整个view频繁的重新渲染
  6. 内存频繁触发Gc过多,导致展示阻塞渲染操作
  7. 屯余资源及逻辑导致加载和执行缓慢

解决ui卡顿:
1.布局优化 include,merge,viewsuble
2.背景和图片等内存分配优化

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android 性能优化实战篇 PDF 是一本介绍如何优化 Android 应用性能的电子书。该书通过实践经验和案例分析,向读者提供了一系列提高应用性能的实用技巧和方法。 该书首先介绍了性能优化的基本概念,例如应用启动时间、内存管理、网络请求和绘制性能等方面。之后,通过对真实应用情景的分析,详细介绍了一些常见的性能问题,并给出了相应的解决方案。 对于应用启动时间的优化,该书提供了一些切实可行的建议。例如合理使用启动模式、使用冷启动的启动动画、减少启动时的初始化操作等。这些方法可以明显减少应用的启动时间,提升用户体验。 在内存管理方面,该书介绍了如何减少内存泄漏和优化内存占用。通过使用合适的数据结构、避免频繁的对象创建和销毁、注意资源的主动释放等方法,可以有效地减少内存开销,提高应用的稳定性和响应速度。 对于网络请求的优化,该书提供了一些网络请求的最佳实践。例如使用合适的网络请求库、优化请求的并发性、合理使用缓存等。这些方法可以减少网络请求的时间,提高数据加载速度,提升用户体验。 对于绘制性能的优化,该书介绍了如何优化布局和渲染过程,提高界面的流畅度。例如使用合适的布局容器、避免过度绘制、使用硬件加速等。这些方法可以减少界面卡顿和掉帧现象,提升应用的视觉效果。 总而言之,Android 性能优化实战篇 PDF 提供了一些宝贵的经验和方法,帮助开发者优化应用的性能,提升用户体验。不仅可以帮助开发者理解性能优化的基本原理,还给出了一些具体的解决方案,对于 Android 应用的开发和优化都非常有帮助。 ### 回答2: 《Android性能优化实战篇》是一本针对Android开发者的重要参考书籍,旨在帮助开发者提升应用性能,提高用户体验。该书内容包含以下几个方面: 1. 性能分析工具:介绍了常用的性能分析工具,如Android Profiler、TraceView等。通过使用这些工具,开发者可以监测应用在不同场景下的性能情况,例如CPU占用、内存使用、网络请求等,从而快速定位并解决性能问题。 2. UI性能优化:详细介绍了Android UI渲染原理以及优化方法。通过合理使用View的绘制流程、减少UI层级和View的复杂度、适当使用缓存等方法,可以提升UI渲染的速度,提高应用的响应性。 3. 内存优化:介绍了内存泄漏的原因及排查方法,提供了避免内存泄漏的最佳实践。此外,还介绍了内存管理机制以及如何合理地使用内存,包括优化Bitmap的加载、使用SparseArray替代HashMap等。 4. 网络优化:讨论了网络请求中存在的性能问题,并提供了相应的解决方法。例如,合理使用缓存技术、减少网络请求的频率、使用多线程进行并发请求等。 通过学习《Android性能优化实战篇》,开发者可以更全面地了解和掌握Android性能优化的方法与技巧,并能够针对具体场景中的性能问题进行准确的分析和解决。这对于提高应用的性能和用户体验具有重要意义。 ### 回答3: 《Android性能优化实战篇》是一本介绍如何提升Android应用性能的实战指南,旨在帮助开发人员通过一系列优化技巧和方法,使应用在运行时更加稳定和高效。 该书首先介绍了性能优化的基本概念和原则,包括优化目标、优化思路等。然后详细讲解了Android系统的性能优化核心内容,如内存优化、CPU优化、网络优化等。其中涉及到了一些基本的工具和技术,如内存泄漏的检测与优化、多线程优化、数据缓存等。同时,该书还提供了一些优化实例,通过示例展示了具体的优化方法和效果。 对于开发人员来说,优化应用的性能是一个非常重要的任务,能够提高用户的体验度和应用的竞争力。《Android性能优化实战篇》通过详细的指导和实例,帮助读者快速理解和掌握性能优化的基本方法和技巧,同时提供了大量实战经验和案例,让读者能够更加深入地了解优化的过程和效果。 总而言之,该书是一本非常实用的Android性能优化指南,对于开发人员来说是一本必备的参考书籍。通过阅读该书,开发人员能够系统地学习和掌握Android应用的性能优化方法,提高应用的性能和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值