Вызываемая и будущая задержка основной темы Android - PullRequest
0 голосов
/ 19 февраля 2019

Я хочу получить некоторые данные из сервиса по запросу и в будущем.Это один из моих кодов:

@Override
public void getCIFilesType(Consumer<String> consumer) {
    try {
        consumer.accept(serviceExecutor.submit(() ->
                service.getCi(EsupFactory.getConfigString(SETTING_ROOT_CI) + "GetCI",
                        translator.makeCiJsonObject("PCiName", "CI_FilesType")).execute())
                .get().body().string());
    } catch (ExecutionException | InterruptedException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

У меня есть 10 таких методов, которые выполняются, как описано выше. Я использовал службу Executor для запуска callable:

ExecutorService serviceExecutor = Executors.newSingleThreadExecutor();

Я - мойактивность У меня есть меню, а затем нажмите на один пункт в меню, фрагмент является транзакцией в деятельности.Все задачи потока сразу начались в onViewCreated во фрагменте:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    presenter.getCis();
}

Но когда я щелкнул по пункту меню, UI свалился, пока все задачи не были закрыты, тогда транзакция была закрыта.Это не первый раз, когда у меня есть эта проблема.Каждый раз, когда я пользуюсь сервисом callable и executor, я не знаю, почему пользовательский интерфейс завален !!!!

Это профилировщик:

enter image description here

У кого-то есть рекомендации для меня !!?Пожалуйста, не говорите мне использовать asyncTask: -)

Что такое строка чтения ??В пользовательском потоке я просто делаю транзакцию, а не выполняю долго выполняющуюся задачу !!!

1 Ответ

0 голосов
/ 19 февраля 2019

Это происходит потому, что вы вызываете get () на будущее, возвращаемое методом execute () .Согласно документам,

Если вы хотите немедленно заблокировать ожидание задачи, вы можете использовать конструкции вида result = exec.submit (aCallable) .get ();

Итак, даже если вы используете фоновый поток, вызывая get , вы блокируете свой основной поток до тех пор, пока фоновый поток не завершит вашу задачу.

Чтобы избежать ненужных пользовательских интерфейсов, вы должныиспользовал обратные вызовы

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