Я хочу отобразить диалог загрузки, когда пользователь переходит к моему 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
Сохраненные фрагменты восстанавливаются (то есть, их события жизненного цикла начинают стрельбу) в методе 'onCreate' активности до любого открытого действия (то есть не в ответ на какую-либо явную транзакцию фрагмента или аналогичную). Учитывая это, вы могли бы уточнить? –
Я думал, что вы явно прикрепляете фрагменты, если это происходит автоматически, то, вероятно, это не сработает. Если вы можете опубликовать код, я мог бы взглянуть. –
Это происходит автоматически; 'onCreate' в' FragmentActivity' вызывает, например, методы 'onAttach' и' onCreate' фрагмента. Проект слишком велик для публикации, однако я попытаюсь придумать мотивирующий образец проекта, чтобы уточнить мой вопрос. –