Android Honeycomb: как определить, когда FragmentTrancaction.commit() завершился?

У меня был этот простой фрагмент кода:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    //...

    NetworkWorker networkFragment = NetworkWorker.createInstance(null);
    fragmentTransaction.add(networkFragment, NETWORK);

    //...

    fragmentTransaction.commit();

    networkFragment.startURLRequest("test");
}

который разбился, когда я вызвал getActivity() в своей подпрограмме startURLRequest().

Как только я переместил вызов startURLRequest() в onStart(), все заработало нормально.

Итак, я немного погуглил и нашел это:

Вызов commit() не выполняет транзакцию немедленно. Скорее, он планирует его запуск в потоке пользовательского интерфейса действия («основном» потоке), как только поток сможет это сделать. Однако при необходимости вы можете вызвать executePendingTransactions() из своего потока пользовательского интерфейса, чтобы немедленно выполнить транзакции, отправленные с помощью commit(). В этом обычно нет необходимости, если транзакция не является зависимостью для заданий в других потоках. [И руководство для разработчиков]

Теперь мой вопрос... действительно ли целесообразно использовать этот executePendingTransactions() или он содержит некоторые ловушки? Есть ли другой способ определить, завершена ли транзакция? Просто предположить, что они могут быть завершены в следующей процедуре Activity, не кажется удовлетворительным.

С уважением, медуза


person jellyfish    schedule 08.06.2011    source источник


Ответы (2)


Возможно, вы думаете об этом неправильно. Вместо того, чтобы вызывать startURLRequest для вашего фрагмента из действия, почему бы не вызвать startURLRequest в методах onAttach, onCreate и т. д. вашего фрагмента, поскольку в эти моменты вы знаете, что фрагмент присоединен к действию, и getActivity() завершится успешно.

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

person PJL    schedule 08.06.2011
comment
Спасибо, я не знал о onAttach. :) - person jellyfish; 08.06.2011

Можно предположить, что фиксация завершена, когда все фрагменты в транзакции возвращаются из onResume (для добавляемых фрагментов).

person sksamuel    schedule 08.06.2011