Как заставить выполнение метода завершиться перед возвратом фрагмента

В моем коде допустим, что я хочу отобразить некоторую строку во фрагменте, и метод getPlayerList занимает 2 секунды (данные из API), но метод 'onCreateView' возвращает представление до того, как getPlayerList завершит свое выполнение.

Я пытался реализовать это разными способами, но все было бесполезно, потому что я не могу изменить "обратный взгляд"; место ^^".

есть ли какой-нибудь метод вместо 'onCreateView', который подходит моей ситуации?

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment_tab4, container, false);

String result = getPlayerList();
//displaying the 'result' on this view

return view; }

2 ответа

Решение

Не запрашивать и ждать в основной теме. Прежде всего, сохраните эту переменную представления как поле вместо локального. затем переместите ваш запрос в onViewCreated метод. и, наконец, использовать обратный вызов вместо возвращаемого значения и выполнять все запросы в фоновом потоке. Вы можете использовать Volley или Retrofit для высокоуровневых сетей. также потому, что вам нужно подождать, пока полученный от сервера результат не заполнит пользовательский интерфейс пустыми строками, прежде чем их устанавливать.

проверьте этот пример в структуре MVP от Google. представление, созданное в методе, но значение пользовательского интерфейса, установленное в другом методе позже. например, см. showDescription метод, который устанавливает описание textview https://github.com/googlesamples/android-architecture/blob/todo-mvp/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/taskdetail/TaskDetailFragment.java

также для обратного вызова см. это public void success метод в ретровифт. https://futurestud.io/tutorials/retrofit-getting-started-and-android-client

вы получаете значение в методе, и вы можете установить это значение в полях зрения.

Итак, как я вижу: проблема для вас в том, что переменная результата не имеет никакого значения, когда вы пытаетесь ее использовать? Если это так, рассмотрите возможность использования этой переменной только после завершения вызова API, чтобы вашему пользователю не пришлось ждать 2 секунды (или больше в некоторых сценариях). Вы можете добавить ProgressBar, чтобы указать вашему пользователю, что что-то происходит.

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