Android-嵌套处理程序/可运行

时间:2020-01-27 18:07:56

标签: java android performance

我的应用程序内容部分的代码太多。大约有3000行XML代码。这导致我的应用程序启动缓慢。 (大约8秒钟内启动),我将内容放置在6个viewtub对象中。我创建了很多处理程序这是个问题吗?它在层次上正确吗?我该如何执行所有这些处理程序操作asynctask。

此外,我该如何使内容更明亮,更快。

谢谢!

 new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            viewStubPager.setLayoutResource(R.layout.viewstubpager);
            coachStubPager = viewStubPager.inflate();
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    viewStub1.setLayoutResource(R.layout.viewstub1);
                    coachStub1 = viewStub1.inflate();
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            viewStub2.setLayoutResource(R.layout.viewstub2);
                            coachStub2 = viewStub2.inflate();
                            viewStub3.setLayoutResource(R.layout.viewstub3);
                            coachStub3 = viewStub3.inflate();
                            viewStub4.setLayoutResource(R.layout.viewstub4);
                            coachStub4 = viewStub4.inflate();
                            viewStub5.setLayoutResource(R.layout.viewstub5);
                            coachStub5 = viewStub5.inflate();
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                                    Objects.requireNonNull(notificationManager).cancelAll();
                                    sharedPreferencesKeys();
                                    initialize();
                                    calculate();
                                    sharedPrefStartup();
                                    alertDialogClickListener();
                                    changeListener();
                                    new Handler().postDelayed(new Runnable() {
                                        @Override
                                        public void run() {
                                            layouts = new int[]{R.layout.vki_slide1, R.layout.vki_slide2, R.layout.vki_slide3, R.layout.vki_slide4, R.layout.vki_slide5, R.layout.vki_slide6, R.layout.vki_slide7, R.layout.vki_slide8, R.layout.vki_slide9};
                                            VKIPagerAdapter = new MyViewPagerAdapter();
                                            vkipager.setAdapter(VKIPagerAdapter);
                                            VKIPagerAdapter.notifyDataSetChanged();
                                            vkipager.setOffscreenPageLimit(10);
                                            vkipager.addOnPageChangeListener(viewPagerPageChangeListener);
                                            pageIndicator.setCount(layouts.length);
                                            pageIndicator.setSelection(0);
                                            bottombar.setVisibility(View.VISIBLE);
                                        }
                                    }, 100);
                                }
                            }, 100);
                        }
                    }, 100);
                }
            }, 100);
        }
    }, 150);

1 个答案:

答案 0 :(得分:0)

有点晚了,但这可能会帮助其他人...

我不知道问题中的代码是否会在我提出的解决方案中启动得更快(我怀疑会是这种情况),但是,它更具可读性并且只使用一个 Runnable。这也可以用于动画。

我从以下答案中得出了这个例子: https://stackoverflow.com/a/11198037/6423246

Handler mHandler = new Handler();
int inflater = YOUR_CONSTANT_1;

void yourFunction() {

    // ...your first inflater code here...

    mHandler.postDelayed(mRunnable, your_delay_in_millis);
}

Runnable mRunnable = new Runnable() {
    @Override
    public void run() {
        switch(inflater) {
            case YOUR_CONSTANT_1 : {

                // ...your second inflater code here...

                inflater = YOUR_CONSTANT_2;
                mHandler.postDelayed(mRunnable, your_delay_in_millis);
                break;
            }
            case YOUR_CONSTANT_2 : {

                // ...your third inflater code here...

                inflater = YOUR_CONSTANT_3;
                mHandler.postDelayed(mRunnable, your_delay_in_millis);
                break;
            }

            // etcetera

            case YOUR_CONSTANT_LAST : {

                // ...your last inflater code here...

                // in your final case, you could opt to remove callbacks
                mHandler.removeCallbacks(mRunnable);
                break;
            }
        }
    }
};