Активность бесконечного цикла при использовании setRequestedOrientation () в API 19 (KitKat)

Метод setRequestedOrientation обычно перезапускает действие на любой версии Android выше, чем Kitkat.

Но в Kitkat, даже используя if, действие продолжает перезапускаться.

    int orientation = getResources().getConfiguration().orientation;

    // Doesn't work
    if (orientation != ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }

    // Doesn't work
    if (orientation != Configuration.ORIENTATION_LANDSCAPE) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
    }

РЕДАКТИРОВАТЬ 1 - StackTrace:

https://gist.github.com/sshnakamoto/11ef6179a561054e54ec4d41a03238f0

Извините, мой журнал слишком длинный, чтобы размещать его здесь. Я создал суть. Но по сути вы увидите цикл между методами onCreate () и onStart ().

РЕДАКТИРОВАТЬ 2 - ActivityCode:

public class TestActivity extends AppCompatActivity {

    private static final String TAG = "TimerActivityCLONE";

    private TextView textView;
    private ConstraintLayout parentView;
    private boolean isColorChanged;

    private int textColor;
    private int parentColor;

    private Handler handler;
    private Runnable runnable;
    private Timer timer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate: started ");
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate: super called ");
        setContentView(R.layout.activity_timer);
        Log.d(TAG, "onCreate: setContentView called ");

        /* Find on layout*/
        parentView = findViewById(R.id.parent);
        textView = findViewById(R.id.textView);

        textColor = Color.WHITE;
        parentColor = Color.BLACK;

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

    }

    private void initTimer() {

        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {
                changeColors();
            }
        };

        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                handler.post(runnable);
            }
        };

        timer = new Timer();
        timer.schedule(timerTask, 0, 1000);
    }

    private void changeColors() {

        Log.d(TAG, "changeColors: size " + textView.getTextSize() / getResources().getDisplayMetrics().scaledDensity);

        if (isColorChanged){
            textView.setTextColor(parentColor);
            parentView.setBackgroundColor(textColor);
            isColorChanged = false;
        } else {
            textView.setTextColor(textColor);
            parentView.setBackgroundColor(parentColor);
            isColorChanged = true;
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: ");
        /* Start to show */
        initTimer();
    }

    @Override
    protected void onStop() {
        super.onStop();
        killTaskAndFinish();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        killTaskAndFinish();
    }

    private void killTaskAndFinish() {

        /* Kill background Thread */
        timer.cancel();
        timer.purge();
        handler.removeCallbacks(runnable);

        /* Restore user screen orientation */
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
    }
}

Я обнаружил ошибку, она возникает при вызове метода killTaskAndFinish () внутри onStop () из-за перезапуска метода ResquestedOrientation ().

Но почему этот цикл возникает только на Kitkat (эмуляторе?)? Тестирую Lollipop не получилось

Какой у Вас вопрос?

Crammeur 26.07.2018 22:47

Как это исправить?

Nakamoto 27.07.2018 00:49

Просто с помощью этого кода я не могу понять, что происходит, и не понимаю вопроса. Можете ли вы добавить stacktrace, записать, если они есть. И разместите больше кода, чтобы лучше понять, что вы хотите.

Crammeur 27.07.2018 00:55

crammeur, у меня сейчас есть трассировка стека. Я опубликовал свой вопрос. Код активности я скоро опубликую

Nakamoto 27.07.2018 15:15
2
4
206
1

Ответы 1

Я не знаю, почему происходит только на KikKat, но мне удалось исправить удаление использования обработчика. В моем случае понадобился только TimerTask.

Это исправляет эту ошибку и предотвращает утечки памяти.

   @Override
    protected void onStart() {
        super.onStart();

        timerTask = new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        changeColors();
                    }
                });
            }
        };

        timer = new Timer();
        timer.schedule(timerTask, 0, speed);
    }

    @Override
    protected void onStop() {
        super.onStop();

        timerTask.cancel();
        timer.cancel();
        timer.purge();
    }

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