Android Honeycomb: как определить, когда FragmentTrancaction.commit () закончил? - PullRequest
1 голос
/ 08 июня 2011

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

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 ().Это обычно не требуется, если транзакция не является зависимостью для заданий в других потоках.[ Руководство AndDev ]

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

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

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

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

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

1 голос
/ 08 июня 2011

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

...