Android 第一个活动需要花费大量时间才能显示

Android 第一个活动需要花费大量时间才能显示,android,performance,android-layout,android-activity,Android,Performance,Android Layout,Android Activity,我在我的应用程序中有一个非常简单的第一个活动,即“飞溅”活动。它只显示一个图像,在一个小动画之后,它启动我的应用程序的主菜单活动 问题是,如果应用程序不在内存中,第一次启动活动需要花费大量时间才能显示。我的意思是,如果我完全从内存中销毁应用程序,然后从头开始,而不在SO最近的应用程序列表中 显示活动内容需要3-4秒。在这3-4秒内,我可以看到一个黑屏(不是100%黑色),系统默认的黑色背景样式,而不是活动的Color.black背景颜色,因此加载第一个应用程序所花费的时间是在显示活动之前花费的

我在我的应用程序中有一个非常简单的第一个活动,即“飞溅”活动。它只显示一个图像,在一个小动画之后,它启动我的应用程序的主菜单活动

问题是,如果应用程序不在内存中,第一次启动活动需要花费大量时间才能显示。我的意思是,如果我完全从内存中销毁应用程序,然后从头开始,而不在SO最近的应用程序列表中

显示活动内容需要3-4秒。在这3-4秒内,我可以看到一个黑屏(不是100%黑色),系统默认的黑色背景样式,而不是活动的Color.black背景颜色,因此加载第一个应用程序所花费的时间是在显示活动之前花费的

为什么一开始就要花这么多钱?也许是为了我在gradle文件中的依赖关系

这些是我的gradle依赖项:

dependencies {
    compile 'com.google.android.gms:play-services-ads:9.0.1'
    compile 'com.android.support:support-v4:23.1.1'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
}
这是简单的飞溅活动。我还尝试了注释
AdManager.getInstance().initAd(这个)
以查看它是否解决了问题。如果该行被注释,则开始所需的时间会少一点。该行初始化admob。但我还是有问题

public class Splash extends Activity {
    private AnimatorSet set;
    private boolean backPressed;

    public void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);

        AdManager.getInstance().initAd(this);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);      
        int sh=dm.heightPixels;
        int sw=dm.widthPixels;

        ImageView splash = new ImageView(getApplicationContext());
        splash.setLayoutParams(new LayoutParams((int) (sw*0.9), LayoutParams.WRAP_CONTENT));
        splash.setImageResource(R.drawable.logo);

        //contenemos la ImageView header dentro de un layout para asi cambiar el color de fondo y que sea el mismo que el de la imagen.
        LinearLayout headerll = new LinearLayout(this);
        RelativeLayout.LayoutParams headerllParams = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, sh/20);
        headerll.addView(splash);
        splash.setPadding(10, 10, 10, 10);
        headerll.setLayoutParams(headerllParams);
        headerll.setBackgroundColor(Color.BLACK);
        headerll.setGravity(Gravity.CENTER);        

        setContentView(headerll);

        set = new AnimatorSet();
        ObjectAnimator in = ObjectAnimator.ofFloat(splash, "alpha", 0f, 1f);
        in.setDuration(2000);
        in.setInterpolator(new AccelerateInterpolator());

        ObjectAnimator delay = ObjectAnimator.ofFloat(splash, "alpha", 1f, 1f);
        delay.setDuration(1000);

        ObjectAnimator out = ObjectAnimator.ofFloat(splash, "alpha", 1f, 0f);
        out.setDuration(2000);
        out.setInterpolator(new AccelerateInterpolator());

        set.addListener(new AnimatorListener() {
            @Override
            public void onAnimationCancel(Animator animation) {}
            @Override
            public void onAnimationEnd(Animator animation) {
                finish();
                Intent i = new Intent(Splash.this, MainActivity.class);
                startActivity(i);
            }
            @Override
            public void onAnimationRepeat(Animator animation) {}
            @Override
            public void onAnimationStart(Animator animation) {}
        });

        set.playSequentially(in,delay,out);
        set.start();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        backPressed=true;
        set.cancel();
    }               
}

根据类似的问题,问题可能出在Android Studio中。此错误仅处于调试模式,不会影响您的发布APK。 尝试以下临时解决方案:

Settings → Build, Execution, Deployment → Instant Run and uncheck Enable Instant Run

根据类似的问题,问题可能出在Android Studio中。此错误仅处于调试模式,不会影响您的发布APK。 尝试以下临时解决方案:

Settings → Build, Execution, Deployment → Instant Run and uncheck Enable Instant Run

您的图像有多大?非常小,例如100x400可能需要显示度量代码来计算宽度和高度,另一个原因可能是动画。尝试将动画代码放入onStart()方法中;意图i=新意图(Splash.this、MainActivity.class);星触觉(i);动画完成后调用。所以,它将在所有动画过程完成后打开活动,这是一个事实@皮尤什古普塔没有关系。。。。加载此活动需要花费大量时间,而不是从动画端开始的另一个活动…您的图像有多大?非常小,类似100x400Maybe DisplayMetrics的代码需要花费时间来计算宽度和高度,另一个原因可能是动画。尝试将动画代码放入onStart()方法中;意图i=新意图(Splash.this、MainActivity.class);星触觉(i);动画完成后调用。所以,它将在所有动画过程完成后打开活动,这是一个事实@皮尤什古普塔没有关系。。。。此活动是一个需要花费大量时间加载的活动,而不是另一个在动画结束时启动的活动。。。。