Как заставить выполнение метода завершиться перед возвратом фрагмента
В моем коде допустим, что я хочу отобразить некоторую строку во фрагменте, и метод 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, чтобы указать вашему пользователю, что что-то происходит.