Не думаю, что вам нужно начинать перехватывать изменения ориентации. Его режущие углы и, возможно, вызовут у вас много головной боли, если вы действительно захотите сделать что-то вроде загрузки разных ресурсов для разных ориентаций.
Основная проблема заключается в том, что ссылка, которую AsyncTask имеет на кнопку, предназначенную для обновления, устарела, она ссылается на вашу старую кнопку. Что вы можете сделать, чтобы решить эту проблему - реализовать Activity.onRetainNonConfigurationInstanceState()
. Этот метод вызывается в ситуациях, когда происходит изменение ориентации, и он позволяет вам хранить элементы, которые не зависят от конфигурации, например, запуск потоков.
Другая вещь, которая вам нужна, - это метод в AsyncTask для установки кнопки, которую он должен включать / отключать. Пока ваша активность перезапускается, вы сбрасываете кнопку и затем сбрасываете ее в onCreate ().
Реализация может выглядеть примерно так.
public class MyActivity extends Activity {
private static final String NON_CONFIG_KEY = "com.example.NON_CONFIG_KEY";
protected void onCreate(Bundle instanceState) {
setContentView(R.layout.main);
HashMap<String, Object> nonConfigState = (HashMap<String, Object>)
getLastNonConfigurationIntstanceState();
if (nonConfigState != null && nonConfigState.get(NON_CONFIG_KEY) != null) {
MyAsyncTask task = (MyAsyncTask) nonConfigState.get(NON_CONFIG_KEY);
task.setUiControl(findViewById(R.id.my_button));
}
}
public Object onRetainNonConfigurationInstanceState() {
task.setUiControl(null);
// create HashMap, store AsyncTask in it, and return it
}
}
public MyAsyncTask extends AsyncTask {
private Button mControl = null;
private boolean shouldUpdateControl = false;
private Object mLock = new Object();
public void setUiControl(Button b) {
synchronized (mLock) {
if (b != null && shouldUpdateControl) {
b.setEnabled(true);
shouldUpdateControl = false;
}
mControl = b;
}
}
protected void onPostExecute(Result r) {
synchronized (mLock) {
if (mControl == null) {
shouldUpdateControl = true;
} else {
mControl.setEnabled(true);
}
}
}
}