Как вынудить основной Acivity ожидать поддействия в Android?

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

     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 (программа бросает ошибку).

6
задан questioner 21 May 2010 в 06:13
поделиться

4 ответа

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

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

В первом действии перезапишите onActivityResult и получите числа из намерения.

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

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

3
ответ дан 8 December 2019 в 13:44
поделиться

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

7
ответ дан 8 December 2019 в 13:44
поделиться

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

3
ответ дан 8 December 2019 в 13:44
поделиться

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

У вас есть одноэлементный класс, назовем его 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();
           }
       }
}
2
ответ дан 8 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: