Как заставить основную Acivity ждать субактивности в Android?

Я вызываю субактивность из основной деятельности. Эта субактивность должна принимать несколько цифр от пользователя (я использую Edit text control для достижения этого), сохраните их в статической переменной в другом классе и завершите. Я хочу, чтобы основная активность ожидала субзависимости, но оба они выполняются одновременно. Даже делать это так не помогает:

Thread t = new Thread(new Runnable(){ public void run(){ Log.v("==================", "run "+new Date()); startActivityForResult(new Intent(ctx,myCustomSubactivity.class),1); } }); Log.v("==================", "calling run "+new Date()); t.start(); try { t.join(); } catch (InterruptedException e) {Log.v("==================", "can't join");} Log.v("==================", "back from activity "+new Date()); 

Знаете ли вы, как заставить основную деятельность ждать? Метод Thread.wait () не поддерживается в Android (ошибка программных ошибок).

    Я согласен с Николаем, это определенно способ андроида.

    Запустите субактивность с помощью startActivityForResult в подзадаче, используя setResult, чтобы добавить код результата и намерение со всеми номерами, которые вам нужны в наборе данных.

    В вашей первой операции перезаписывайте onActivityResult и извлекайте числа из Intent.

    Если вы используете статическую переменную, это кажется проще в первый момент, но это очень неуверенно, и в некоторых случаях это может не сработать. Если ваша программа будет отправлена ​​на задний план, ваши действия будут сохранены, но если в телефоне будет мало памяти, система закроет вашу программу, и после того, как пользователь возобновит ее, все будет выглядеть так, как только пользователь оставит ее, но статические переменные будут воссозданы до Их значение инициализации.

    Попытайтесь привыкнуть к тому, как работает жизненный цикл активности андроида. Использование этого подхода приведет к меньшему количеству использованной памяти и значительно лучшему пользовательскому интерфейсу.

    Может быть, я что-то пропустил, но почему бы просто не использовать механизм startActivityForResult и onActivityResult ? Вы можете получить результат от вашей субактивности от намерения, с которым он был приведен.
    Редактирование: Кстати, насколько я понимаю, если вы запустите Object.wait() из кода операции, если будет удерживать прокрутку в пользовательском интерфейсе, это может привести к ошибке Application not responding .

    Посмотрите пример «Блокнот» , он охватывает именно эту ситуацию. И, как говорили другие, Android-способ состоит в том, чтобы ваш первый запуск запускал вашу вторую активность (а не суб-активность!) И асинхронно слушал ответ (не приостанавливать или ждать, не нужно присоединяться и т. Д.).

    Ну … вы можете сделать это так (кстати, нет прямого пути):

    У вас есть одноэлементный класс, назовем его Monitor:

     public class Singleton { private Singleton() { } private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } } public class ParentActivity extends Activity { private void startAndWait() { Intent i = new Intent(); // initialize i startActivityForResult(i); Singleton si = Singleton.getInstance(); synchronized(si) { si.wait(); } //do remaining work } } public class ChildActivity extends Activity { protected void onCreate(Bundle savedInstance) { //do all the work Singleton si = Singleton.getInstance(); synchronized(si) { si.notify(); } } } 

    Я не здесь, чтобы судить, хорошо ли это или нет, но если вам действительно нужна активность, чтобы подождать суб-активность, вы можете попробовать этот подход:

    • Определить объект (блокировку), по которому синхронизируются два действия; Это может (должно) также работать как объект для обмена данными между этими двумя действиями и, следовательно, должно быть определено как статическое
    • В родительской активности, запустите задачу async (поскольку основной поток пользовательского интерфейса не может находиться в состоянии ожидания)
    • В асинхронной задаче, начните свою суб-активность
    • Асинхронная задача ждет блокировки до получения уведомления
    • Суб-активность делает все, что ему нужно, и уведомляет ожидающий поток, когда он заканчивается

    Я сделал аналогичную вещь в своем приложении, и у IMHO была хорошая причина для этого (чтобы не беспокоить пользователя с экраном входа в систему при запуске или возобновлении приложения, приложение пытается повторно использовать учетные данные, хранящиеся в защищенном месте, и только в случае его отказа , Он показывает этот экран входа в систему. Так что да, в основном любая активность в моем приложении может быть «приостановлена» и ждет, пока пользователь не предоставит правильные учетные данные в активности входа, по которой заканчивается экран входа в систему, и приложение продолжает то, где оно было приостановлено (в Родительская активность).

    В коде это будет примерно так:

    ParentActivity:

      public class ParentActivity extends Activity { private static final String TAG = ParentActivity.class.getSimpleName(); public static class Lock { private boolean condition; public boolean conditionMet() { return condition; } public void setCondition(boolean condition) { this.condition = condition; } } public static final Lock LOCK = new Lock(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.parent_layout); // do whatever logic you need and anytime you need to stat sub-activity new ParentAsyncTask().execute(false); } private class ParentAsyncTask extends AsyncTask<Boolean, Void, Boolean> { @Override protected Boolean doInBackground(Boolean... params) { // do what you need and if you decide to stop this activity and wait for the sub-activity, do this Intent i = new Intent(ParentActivity.this, ChildActivity.class); startActivity(i); synchronized (LOCK) { while (!LOCK.conditionMet()) { try { LOCK.wait(); } catch (InterruptedException e) { Log.e(TAG, "Exception when waiting for condition", e); return false; } } } return true; } } } 

    ChildActivity:

     public class ChildActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.child_layout); // do whatever you need in child activity, but once you want to finish, do this and continue in parent activity synchronized (ParentActivity.LOCK) { ParentActivity.LOCK.setCondition(true); ParentActivity.LOCK.notifyAll(); } finish(); // if you need the stuff to run in background, use AsyncTask again, just please note that you need to // start the async task using executeOnExecutor method as you need more executors (one is already occupied), like this: // new ChildAsyncTask().executeOnExecutor(ChildAsyncTask.THREAD_POOL_EXECUTOR, false); } }