0

Я хочу отобразить диалог загрузки, когда пользователь переходит к моему activity до возобновления activity - это возможно?Загрузка экрана до возобновления активности

Вот какой-то фон - при первом запуске активности загружается dialog, пока некоторое состояние кешируется из файла. Это занимает второе место на новых телефонах, но может потребоваться больше времени на старых моделях, слишком долго для запуска в потоке пользовательского интерфейса в любом случае. Состояние кэширования может быть уничтожено сборщиком мусора (или процесс может быть убит), прежде чем пользователь перейдет к активности, что приведет к проблемам, возобновляющим активность. В частности, восстановленные события жизненного цикла фрагментов начинают срабатывать внутри метода активности onCreate, и они сильно зависят от состояния кеширования. В идеале должен отображаться диалог загрузки, а события жизненного цикла ребенка fragments следует отложить до тех пор, пока не восстановится состояние кеширования.

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

ОБНОВЛЕНИЯ

А (изобретенный) пример приведен ниже - активность отображает диалоговые После загрузки, который отображается кнопкой, чтобы создать диалоговый фрагмент. На этом этапе деятельность прекращается и возобновляется; как и ожидалось, диалоговое окно теста автоматически восстанавливается до завершения диалога загрузки. Вопрос в том, как может (или ) этот процесс задерживается, чтобы диалог загрузки завершился до восстановления диалогового окна теста.

Класс активности:

public class MainActivity extends AppCompatActivity { 
    private static final String TAG = MainActivity.class.getSimpleName(); 
    private ProgressDialog dialog_ = null; 
    private Button button_ = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     Log.v(TAG, "onCreate: start"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     button_ = (Button)findViewById(R.id.testButton); 

     // A loading dialog is displayed when the activity is created if the cached state is null 
     if (State.get() == null) { 
      // Using a button here instead of some content fragment for convenience 
      button_.setVisibility(View.GONE); 

      // Create a loading dialog 
      dialog_ = new ProgressDialog(this); 
      dialog_.setMessage("Loading..."); 
      dialog_.setIndeterminate(true); 
      dialog_.show(); 

      // Create the cached state in a background thread 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        Log.v(TAG, "State.create: start"); 
        State.create(MainActivity.this); 
        Log.v(TAG, "State.create: end"); 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          if (dialog_ != null) { 
           dialog_.dismiss(); 
           dialog_ = null; 
          } 

          // When the loading dialog is finished the content fragment is loaded; 
          // here the button is merely displayed. Ideally the life-cycle events 
          // in TestDialog should not be called until after this point. 
          button_.setVisibility(View.VISIBLE); 
          Log.v(TAG, "Loading finished"); 
         } 
        }); 
       } 
      }).start(); 
     } 
     Log.v(TAG, "onCreate: end"); 
    } 

    public void handleTestButton (final View view) { 
     Log.v(TAG, "handleTestButton"); 

     // A dialog fragment is added here; the framework will automatically restore the fragment 
     // if the activity is terminated and restored. 
     new TestDialog().show(getSupportFragmentManager(), null); 
    } 
} 

Диалог теста:

public class TestDialog extends DialogFragment { 
    private static final String TAG = TestDialog.class.getSimpleName(); 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     if (State.get() == null) 
      Log.w(TAG, "onAttach: state was null"); 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (State.get() == null) 
      Log.w(TAG, "onCreate: state was null"); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     if (State.get() == null) 
      Log.w(TAG, "onCreateView: state was null"); 

     return inflater.inflate(R.layout.test_dialog, container, false); 
    } 
} 

общего состояния:

public class State { 
    private static Object state_ = null; 

    // A long running process is performed on a background thread; locking omitted for clarity 
    public static void create (final Context context) { 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
     } 

     state_ = new Object(); 
    } 

    // Fragment life-cycle events require the cached state 
    public static Object get() { 
     return state_; 
    } 
} 

Когда выше выполняется следующее первоначально выпускались:

onCreate: start 
onCreate: end 
State.create: start 
State.create: end 
Loading finished 
handleTestButton 

После завершения и повторного запуска приложения следующего производится:

onCreate: start 
onAttach: state was null 
onCreate: state was null 
onCreate: end 
State.create: start 
onCreateView: state was null 
State.create: end 
Loading finished 

ответ

0

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

Теперь, когда ваша логика находится в onResume(), вы можете показать ProgressDialod, как только вызывается onResume. Затем вы должны проверить, закончились ли ваши кешированные данные. Когда он полностью загружается, вы можете отклонить ProgressDialog и написать логику для прикрепления фрагментов.

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

+0

Сохраненные фрагменты восстанавливаются (то есть, их события жизненного цикла начинают стрельбу) в методе 'onCreate' активности до любого открытого действия (то есть не в ответ на какую-либо явную транзакцию фрагмента или аналогичную). Учитывая это, вы могли бы уточнить? –

+0

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

+0

Это происходит автоматически; 'onCreate' в' FragmentActivity' вызывает, например, методы 'onAttach' и' onCreate' фрагмента. Проект слишком велик для публикации, однако я попытаюсь придумать мотивирующий образец проекта, чтобы уточнить мой вопрос. –