Я начинаю действие и вызываю асинтаксическую задачу в onCreateView () для получения данных из веб-службы и заполнения данных в onPostExecute (). В настоящее время действие не загружается, пока не завершится асинхронная задача во фрагменте.

Как я могу сразу отобразить пустую форму и обновить ее по завершении задачи? Действие просто размещает фрагменты, а асинтаксические задачи находятся во фрагментах, если это имеет значение.

Фрагмент onCreateView ():

    @Override
public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_friends,container, false);




    return v;

}

Фрагмент onActivityCreated ():

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

    //getFriends() calls a method that is an asyntask
    peopleList = getFriends();

    if (peopleList!=null){
    list = (ListView)getActivity().findViewById( R.id.friendsList);

    list.setAdapter(new FriendsAdapter(getActivity(), peopleList,"friends") );

    }
}
3
TheGeekNess 21 Мар 2014 в 00:56
Вы можете показать, как вы вызываете асинхронную задачу? Вы не можете запустить асинхронную задачу в onViewCreated (после создания фрагмента)?
 – 
peshkira
21 Мар 2014 в 00:59
//getFriends() calls a method that is an asyntask Как метод может быть AsyncTask? Ты меня смущаешь.
 – 
donfuxx
21 Мар 2014 в 01:01

2 ответа

Лучший ответ

Это связано с тем, что вы заполняете данные onPostExecute (), которые подключаются к потоку пользовательского интерфейса только после завершения doInBackground (). Если вы хотите показать прогресс по мере того, как что-то происходит, вам нужно вызвать метод publishProgress ().

Теперь метод publishProgress () подключается к методу onProgressUpdate (), и это подключается к потоку пользовательского интерфейса, который обновляет поток пользовательского интерфейса во время выполнения doInBackground (). Я привел очень простой пример того, что делал когда-то на практике - посмотрите, как это работает. Он в основном продолжает обновлять ListActivity, по одному элементу за раз, и показывает этот прогресс на экране - он не ждет, пока все строки будут добавлены для отображения последней страницы:

class AddStringTask extends AsyncTask<Void, String, Void> {


    @Override
    protected Void doInBackground(Void... params) {
        for(String item : items) {
            publishProgress(item);
            SystemClock.sleep(400);
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(String... item) {
        adapter.add(items[0]);
    }

    @Override
    protected void onPostExecute(Void unused) {
        Toast.makeText(getActivity(), "Done adding string item", Toast.LENGTH_SHORT).show();
    }

}
1
germi 8 Авг 2017 в 17:10
Оказывается, моя настоящая проблема заключалась в том, что во время моего полуночного сеанса кодирования когда-то давно я сделал централизованную асинхронную задачу, которую я вызывал отовсюду... с помощью Task.get(), как идиот. Я принял этот ответ, потому что это отличная информация и, учитывая проблему, которую я описал, это правильный ответ для всех, кто ищет решения.
 – 
TheGeekNess
21 Мар 2014 в 06:49

Вы должны выполнять как можно меньше трудоемких задач в методе onCreate () вашей Activity. Обратите внимание, что ваша форма будет нарисована только после того, как onCreate () будет «полностью» выполнен. Хорошая идея - начать трудоемкую задачу с таймера с небольшой задержкой (50–100 мс), чтобы быть уверенным, что ваш метод onCreate () завершил выполнение.

Вот пример (поместите это вместо getFriends ()):

Handler getFriendsDelayed = new Handler(); 
getFriendsDelayed.postDelayed(new Runnable()
{ 
    public void run()
    {
        getFriends();
    }
}, DELAY_IN_MILLISEC);

Надеюсь, это поможет.

0
Akos 21 Мар 2014 в 02:08