Метод запуска моего объекта animationdrawable замедляет работу моего приложения, какие решения?

Я пишу базовое приложение для Android. Я создал объект AnimationDrawable для отображения нескольких изображений в моем макете и установил его. После этого мое приложение начало тормозить. И я даже пытался работать с этим блоком кода в новом потоке, но это не сработало, как я себе представлял. Что я сделал не так? или есть какое-то решение? Заранее спасибо.

Я вызываю этот метод в моем методе onCreate ();

/*
 * This method configures the background animation
 * */
private void configureAnimation(){
    animation = new AnimationDrawable();
    for (int i = 0; i < bgImage.length; i++) {
        animation.addFrame(getResources().getDrawable(bgImage[i]), 5000);
    }
    animation.setEnterFadeDuration(1000);
    animation.setOneShot(false);

    linearLayout = (LinearLayout) findViewById(R.id.mLayout);
    linearLayout.setBackground(animation);

    animation.start();
}

Целый класс;

package com.example.yekta.loginapp;

import android.graphics.drawable.AnimationDrawable;
import android.os.Build;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.Toast;



public class MainActivity extends AppCompatActivity {

    private LinearLayout linearLayout;
    private AnimationDrawable animation;
    private int []bgImage = {R.drawable.wallpaper00, R.drawable.wallpaper01};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.placeholder_fragment, new LoginFragment());
        ft.commit();

        hideActionBar();
        changeStatusBarColor(R.color.black);

        // First Approach
        //configureAnimation();

        // Second Approach with using Thread
        //startProgress();

        // Third Approach
        animation = new AnimationDrawable();
        handleAnimation(100,animation);
        animation.start();
    }


    /*
    * This is simple method that changes the color of status bar.
    * @param colorCode is the color code that given in value file
    * */
    private void changeStatusBarColor(final int colorCode) {
        if (Build.VERSION.SDK_INT >= 21) {
            Window window = this.getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(ContextCompat.getColor(this, colorCode));
        }
    }

    /*
     * This is simple method that hides the Action bar.
     * */
    private void hideActionBar(){
        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();
    }

    /*
     * This method configures the background animation
     * */
    private void configureAnimation(){
        animation = new AnimationDrawable();
        for (int i = 0; i < bgImage.length; i++) {
            animation.addFrame(getResources().getDrawable(bgImage[i]), 5000);
        }
        animation.setEnterFadeDuration(1000);
        animation.setOneShot(false);

        linearLayout = (LinearLayout) findViewById(R.id.mLayout);
        linearLayout.setBackground(animation);

        animation.start();
    }

    public void startProgress() {
        final Handler handler = new Handler();
        handler.post(new Runnable() {
            @Override
            public void run() {
                configureAnimation();
            }
        });
    }

    private void handleAnimation(final int time, final AnimationDrawable animation) {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < bgImage.length; i++) {
                    animation.addFrame(getResources().getDrawable(bgImage[i]), 5000);
                }
                animation.setEnterFadeDuration(1000);
                animation.setOneShot(false);
                linearLayout = (LinearLayout) findViewById(R.id.mLayout);
                linearLayout.setBackground(animation);
            }
        }, time);
    }
}

в чем ценность bgImage.length? а также насколько велики фоновые изображения

Lino 10.08.2018 17:55

@Lino В данный момент в этом массиве только два изображения, так что сейчас их 2.

Yekta Sarıoğlu 10.08.2018 18:01

Позвольте мне видеть, вы хотите сделать анимацию заставки перед экраном входа в систему? Пожалуйста, удалите animation.start () из OnCreate

Daniel 10.08.2018 20:05
0
3
44
2

Ответы 2

Я думаю, что безопаснее называть его onResume (), если вы запустите анимацию в OnCreate (), вы, вероятно, получите ANR, и вы можете попробовать этот подход:

animation = new AnimationDrawable();          
animation.start();
handleAnimation(100,animation);

private void handleAnimation(final int time, final AnimationDrawable animationDrawable) {
         Handler handler = new Handler();
         handler.postDelayed(new Runnable() {
               @Override
                public void run() {
               for (int i = 0; i < bgImage.length; i++) {
                    animation.addFrame(getResources().getDrawable(bgImage[i]), 5000);
              }
               animation.setEnterFadeDuration(1000);
               animation.setOneShot(false)
               linearLayout = (LinearLayout) findViewById(R.id.mLayout);
               linearLayout.setBackground(animation);
             }
           }, time);
        }

Все тот же. Я даже попытался переключить между ними строку animation.start () и строку реализации handleAnimation (). Но пользовательский интерфейс по-прежнему работает значительно медленнее.

Yekta Sarıoğlu 10.08.2018 19:12

Вы можете опубликовать полный курс?

Daniel 10.08.2018 19:21

Я нахожу свою проблему: D. И это была глупая проблема, основанная на плагине ресурсов, который я установил в Android Studio, Android Drawable Importer. Проблема в том, что изображение было настолько огромным, что загружалось в эмулятор экрана HD, поэтому оно естественным образом замедляло работу приложения. Когда я настроил его на нормальные размеры, которые должны быть, это решило мою проблему. Мне очень жаль, что я не тороплюсь: D. Спасибо всем, кто пытался мне помочь. Всем удачного кодирования.

Другие вопросы по теме