СИТУАЦИЯ:
Приложение с ресурсами для портрета и ландшафта имеет симулятор, который я сохраняю после изменения конфигурации (пользователь может переключать ориентацию во время моделирования).
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Installer.installApkData(this);
simulator = new Simulator(this);
MainActivity prevActivity = (MainActivity)getLastCustomNonConfigurationInstance();
if(prevActivity!= null) {
// So the orientation did change
// Restore some field for example
this.simulator = prevActivity.simulator;
//this.mNavigationDrawerFragment = prevActivity.mNavigationDrawerFragment;
//this.mTitle = prevActivity.mTitle;
Log.d("APP","Activity restarted: simulator recreated");
}
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.activity_main);
setProgressBarVisibility(true);
mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager()
.findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public Object onRetainCustomNonConfigurationInstance() {
//restore all your data here
return this;
}
...
В действии есть метод, который изменяет выбранный раздел в NavigationDrawer в потоке пользовательского интерфейса, потому что в противном случае происходит сбой.
public void showHud() {
// TODO Auto-generated method stub
runOnUiThread( new Runnable() {
public void run() {
mNavigationDrawerFragment.select(1);
onSectionAttached(2);
restoreActionBar();
}
});
}
Этот метод используется для прямого перехода к отображению моделирования после подключения симулятора.
ПРОБЛЕМА:
Вся эта система работает кроме того случая, когда я подключаю тренажер после переключения ориентации. Он выполняет runOnUiThread, но ничего не делает. Я думаю, причина этого в том, что он теряет поток пользовательского интерфейса, создавший это представление, при перезапуске активности.
Как вы можете видеть, есть две строки, прокомментированные при перезагрузке симулятора, где я также безуспешно пытался сохранить объект NavigationDrawer в тесте: такое же поведение.
Я также попытался сохранить prevActivity и в методе showHUD(), сначала спросив, является ли он нулевым, а если нет, выполнить метод внутри prevActivity. Ожидая, что он получит доступ к исходному потоку пользовательского интерфейса, но я ошибся.
Есть ли решение сохранить этот поток пользовательского интерфейса во время перезапуска активности? или, может быть, другой тип решения?
Большое спасибо.