美文网首页
Android 页面跳转卡顿优化

Android 页面跳转卡顿优化

作者: 懒人改变世界_ | 来源:发表于2020-04-21 15:53 被阅读0次
    开发时我们会遇到跳转页面特别慢的问题,在性能越差的设备上越明显。跳转页面卡顿,一般原因都是页面创建时需要处理太多事情导致的。
    我们这里可以分步骤并且延时去做页面初始化所需要做的事情,让页面打开的一瞬间不需要做太多的事情,让处理事情的过程更加平滑。从而解决跳转页面卡顿问题

    具体代码我们可以这样写:

    下面主要用到SubstepDelayedLoad类来做延迟和任务串联,delayed(时长毫秒)来设置延迟(没有设置的话默认是100毫秒), run()是主要执行的任务。

    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.util.Log;
    import android.view.ViewStub;
    
    public class MainActivity extends AppCompatActivity {
    
        private final String TAG = "delayedLoad";
    
        private ViewStub viewStub;
    
        private SubstepDelayedLoad delayedLoad = new SubstepDelayedLoad();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            viewStub=findViewById(R.id.viewStub);
            Log.i(TAG, "页面打开了");
            delayed();
        }
    
        /**
         * 分步延时处理任务
         */
        private void delayed() {
            delayedLoad
                    .delayed(100)
                    .run(new Runnable() {
                        @Override
                        public void run() {
                            Log.i(TAG, "执行第一个任务");
                            //延时加载布局
                            viewStub.inflate();
                        }
                    })
                    .delayed(200)
                    .run(new Runnable() {
                        @Override
                        public void run() {
                            Log.i(TAG, "执行第二个任务");
                            //延时做其他耗时任务
                        }
                    })
                    .delayed(300)
                    .run(new Runnable() {
                        @Override
                        public void run() {
                            Log.i(TAG, "执行第三个任务");
                        }
                    })
                    .delayed(100)
                    .run(new Runnable() {
                        @Override
                        public void run() {
                            Log.i(TAG, "执行第四个任务");
                        }
                    }).start();
        }
    
        @Override
        protected void onDestroy() {
            //如果不需要处理了,释放掉
            delayedLoad.clearAllRunable();
            super.onDestroy();
        }
    }
    

    里边用的SubstepDelayedLoad类代码如下:

    import android.os.Handler;
    import android.os.Message;
    
    import androidx.annotation.NonNull;
    
    import java.lang.ref.WeakReference;
    import java.util.LinkedList;
    import java.util.Queue;
    
    /**
     * ====================================================
     * 作者:          Clark
     * 创建时间:      2020/4/11 16:59
     * 类作用描述:    分步延时加载
     * ====================================================
     */
    public class SubstepDelayedLoad {
    
        //默认延迟
        private final long DEF_DELAYED = 100;
    
        //设置的延迟
        private long setDelayed = DEF_DELAYED;
    
        //队列保存每一个任务
        private Queue<RunableBean> queue = new LinkedList<>();
    
        private MyHandler handler;
    
        //静态Handler加弱引用 防止内存泄漏
        private static class MyHandler extends Handler{
            private WeakReference<Queue<RunableBean>> mTargetRef;
    
            public MyHandler(Queue<RunableBean> queue){
                mTargetRef=new WeakReference(queue);
            }
    
            @Override
            public void handleMessage(@NonNull Message msg) {
                if(mTargetRef==null){
                    return;
                }
                Queue<RunableBean> queue = mTargetRef.get();
                if(queue==null){
                    return;
                }
                //执行当前任务
                RunableBean run=queue.poll();
                run.runnable.run();
    
                //延时执行下一个任务
                RunableBean runNext=queue.peek();
                if(runNext==null){
                    return;
                }
                sendEmptyMessageDelayed(1,runNext.delayed);
            }
    
            /**
             * 清除所有任务
             */
            public void clearAllRunable(){
                mTargetRef.clear();
                mTargetRef=null;
            }
        }
    
        /**
         * 设置下一个任务的延迟时间
         * 注:调用delayed()后,再调用run()
         * @param millisecond
         * @return
         */
        public SubstepDelayedLoad delayed(long millisecond) {
            this.setDelayed = millisecond;
            return this;
        }
    
        /**
         * 设置一个任务
         * 注:调用run()之前,先调用delayed()。不调用就是默认延迟 DEF_DELAYED
         * @param runnable
         * @return
         */
        public SubstepDelayedLoad run(Runnable runnable) {
            //任务添加进队列
            RunableBean newRun=new RunableBean();
            newRun.delayed=this.setDelayed;
            newRun.runnable=runnable;
            queue.offer(newRun);
    
            //延迟时间恢复默认
            this.setDelayed=DEF_DELAYED;
            return this;
        }
    
        public void start() {
            if(handler!=null){
                throw new IllegalStateException("It can only be started once");
            }
            handler = new MyHandler(queue);
    
            RunableBean run=queue.peek();
            handler.sendEmptyMessageDelayed(1,run.delayed);
        }
    
        /**
         * 清掉所有任务
         */
        public void clearAllRunable(){
            handler.clearAllRunable();
            handler=null;
            queue.clear();
            queue=null;
        }
    
        private static class RunableBean {
            public long delayed;
            public Runnable runnable;
        }
    }
    

    相关文章

      网友评论

          本文标题:Android 页面跳转卡顿优化

          本文链接:https://www.haomeiwen.com/subject/rpsevhtx.html