Синхронный startActivityForResult - ожидание завершения действия - PullRequest
5 голосов
/ 15 июня 2011

У меня есть приложение, в котором я запускаю новое действие, и мне нужно иметь результат действия, прежде чем продолжить.

Я понимаю, что startActivityForResult является асинхронным / неблокирующим, и что я могу получить результат действия в обратном вызове onActivityResult.

Так что, я думаю, что я ищу, это лучший способ дождаться возвращения активности ... Может быть, что-то подобное? Или есть лучший способ?

Функция запуска активности:

public String ActivityLauncher()
{
   //Set up Intent
   startActivityForResult(intent, 1);
   while (mIsActivityDone == false)
   {
       Thread.Sleep(250);
   }
   //Continue with processing
   String data = "<Data from Activity">
   return data;
}

Обратный звонок:

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
   //Pull out the data
   mIsActivityDone = true;
}

Данные должны быть возвращены в вызывающую функцию более высокого уровня - вот почему мне нужно дождаться результата в функции ActivityLauncher.

Спасибо!

Ответы [ 2 ]

7 голосов
/ 15 июня 2011

Это заблокирует ваш поток пользовательского интерфейса, поэтому другие действия также не будут выполняться. Я бы использовал некоторый класс обратного вызова, предоставляемый функцией более высокого уровня, в такой ситуации и вызвал бы его функцию обратного вызова в onActivityResult

2 голосов
/ 23 ноября 2011

Если вы можете начать эти действия из нового потока, то у Android есть решение для вас. Вы можете использовать Инструментарий. Зачем вам новая тема? Потому что startActivitySync проверит, вызывается ли он в главном потоке. Если его основной поток, то он выдаст исключение.

Инструментарий позволяет контролировать деятельность. Вы можете отслеживать эту активность либо блокирующим, либо неблокирующим образом.

IntentFilter intF = new IntentFilter("ACTIVITY.THAT.YOU.WANT.TO.LAUNCH");

Instrumentation instrumentation = new Instrumentation();

Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor(intF, null, true);
Intent i = new Intent("ACTIVITY.THAT.YOU.WANT.TO.LAUNCH");
instrumentation.startActivitySync(i);
...