Черный экран во время выполнения setContentView - PullRequest
2 голосов
/ 07 марта 2011

У меня есть MainActivity.Иногда при загрузке наблюдаю черный экран на секунду.Я измерил время выполнения операций методом onCreate и обнаружил, что на setContentView(R.layout.main_screen); было потрачено более одной секунды. Я предпочитаю показывать предыдущий экран (в моем случае экран-заставку) вместо этого черного экрана во время выполнения setContentView. Как мне избавиться от этого черного экрана?

Кажется, что Android каким-то образом предварительно загружает макеты, и такие проблемы иногда возникают.Но если я убиваю свой процесс и запускаю приложение, я всегда вижу этот черный экран.

1 Ответ

2 голосов
/ 21 октября 2011
  1. Используйте статическую переменную для обработки кэша View.
  2. Используйте AsyncTask, чтобы не заморозить свое происхождение Activity
  3. Используйте LayoutInflater, чтобы накачать макет View и кэшировать его
  4. В onCreate() целевой операции установите кэш

Примерно так:

Происхождение деятельности

...
                //noinspection unchecked
                new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... params) {
                        LayoutInflater inflater = (LayoutInflater)
                                MainParentActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

                        // VERY VERY SLOW action if your Activity is heavy
                        DialerActivity.cachedView = inflater.inflate(R.layout.dialer_portrait, null, false);
                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void aVoid) {
                        Intent intent = new Intent(MainParentActivity.this, DialerActivity.class);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                        startActivity(intent);
                    }
                }.execute();

...

Целевая деятельность

public class DialerActivity extends MainParentActivity {
    static View cachedView = null;

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

        if (cachedView != null) {
            setContentView(cachedView);
        } else {
            setContentView(R.layout.dialer_portrait);
        }
    }
 . . .

Вы также можете использовать ProgressDialog во время надувания, чтобы избежать ощущения замерзания при переходе.

...