начать новый Android активность так медленно - PullRequest
6 голосов
/ 14 мая 2011

Я хочу открыть новое действие:

Intent intent = new Intent(homeScreen.this, EmployeeService.class);         
Bundle b = new Bundle();
b.putInt(Constants.SERVICE_DETAIL_L1_ID_MSG, ServiceIndex.SRV_L1_EMPLOYMENT);
b.putInt(Constants.SERVICE_DETAIL_FOCUS_POS_MSG, 2);
intent.putExtras(b);
startActivity(intent);

Но требуется много времени, чтобы целевое действие (EmployeeService) стало видимым.В Logcat я вижу:

05-14 23:43:31.727: INFO/ActivityManager(59): Displayed activity fr.playsoft.happylille/.employee.EmployeeService: 7050 ms (total 7050 ms)

Я не могу поверить, что для открытия нового занятия требуется больше 7 секунд.Я добавляю журнал в onCreate (), но вижу, что для завершения onCreate требуется всего 5 мс.

Кто-нибудь может подсказать, как найти корень этой проблемы?

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

Вы должны переместить код Html.fromHtml(desc); в поток, чтобы он был асинхронным. Этот поток может быть безопасно запущен во время onCreate() недавно открытого Activity.

В конце этого потока вы можете запустить tvDesc.setText() из потока пользовательского интерфейса:

class ExampleThread extends Thread {
    @Override
    public void run() {
         final Spanned spannedText = Html.fromHtml(desc);

         yourNewlyOpenedActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tvDesc.setText(spannedText);
                }
         });
    }
}

В общем, 7 секунд на устройстве могут означать 20 на другом, поэтому остерегайтесь ANR !

(отредактировано дополнительно к комментарию Boy ниже, прежняя версия этого ответа больше не была точной / действительной)

1 голос
/ 17 марта 2016

Ответ Шлублу неверен, вам не разрешено делать обновления пользовательского интерфейса из не-пользовательских потоков!

Сначала кажется, что это работает, но это просто удача, время.

просто быстрый уродливый тест доказывает, что в «правильные» сроки он пойдет не так. Здесь я устанавливаю текст каждые 100 мс. Вылетит примерно через 1 секунду:

      new Thread() {

        @Override
        public void run() {
            while (true) {
                someTextView.setText("bla");

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();

Он выдаст эту ошибку: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Я думаю, вы должны выполнить Html.fromHtml(desc) через AsyncTask или RxJava

0 голосов
/ 29 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...