Вам нужно сделать свой AsyncTask статическим внутренним классом, и у него есть свойство, которое является ссылкой на вашу активность.Затем вы можете просто вызывать методы вашей Activity напрямую - как вы для UIupdate ().
Проблема, о которой вы должны знать, заключается в том, что теперь вы должны быть ОЧЕНЬ осторожны, чтобы очистить эту ссылку на свою активность в любых обратных вызовах onPause, в противном случае вы установили циклическую ссылку, и это приведет к утечкам памяти.
Мой шаблон должен иметь другой базовый Java-объект, обычно другой частный статический класс в Activity, который я называю «StateHolder», и его шлюз для обработки вещей AsyncTask, таких как его инициализация и очистка (установка в NULL) и отмена любых задач, выполняемых во время изменений ротации.В вашем обратном вызове для «onRetainNonConfigurationInstance» вы можете передать использование StateHolder в качестве выделенного объекта.
Вот примерный код:
закрытый статический класс GetConnectionsStatusTask extends AsyncTask {private BoothActivity mActivity;private Exception mReason;
public GetConnectionsStatusTask(BoothActivity activity) {
super();
mActivity = activity;
}
public void setActivity(BoothActivity activity) {
mActivity = activity;
}
@Override
protected void onPreExecute() {
if(mActivity != null) {
mActivity.startProgressBar("Loading", "Please wait");
}
}
@Override
protected Connections doInBackground(Void... values) {
try {
App app = (App)mActivity.getApplication();
return(app.getApp().userConnections());
}catch(Exception e) {
mReason = e;
return(null);
}
}
@Override
protected void onPostExecute(Connections status) {
super.onPostExecute(status);
if(mActivity != null) {
mActivity.completedConnectionsStatusCheck(status, mReason);
}
}
}
закрытый статический класс StateHolder {private GetConnectionsStatusTask connectionsTask;
public void cancelTasks() {
if (connectionsTask != null) {
connectionsTask.setActivity(null);
connectionsTask.cancel(true);
connectionsTask = null;
}
}
public void setActivityForTasks(BoothActivity activity) {
if (connectionsTask != null) {
connectionsTask.setActivity(activity);
}
}
public void startConnections(BoothActivity activity) {
if(mIsConnectionsChecking == false) {
mIsConnectionsChecking = true;
connectionsTask = new GetConnectionsStatusTask(activity);
connectionsTask.execute();
}
}
}
Затем в onPause у меня есть код, подобный:
if(mStateHolder != null) {
mStateHolder.cancelTasks();
}
И вПри создании вы можете повторно накачать ваш StateHolder следующим образом:
Object retained = getLastNonConfigurationInstance();
if(retained != null && retained instanceof StateHolder) {
mStateHolder = (StateHolder) retained;
mStateHolder.setActivityForTasks(this);
} else {
mStateHolder = new StateHolder();
}
Это также приведет к повторной инициализации StateHolder с текущей активностью, чтобы вы могли заново устанавливать любые виджеты пользовательского интерфейса, такие как обновления индикатора выполнения и т. д.
Используя этот шаблон, вы фактически можете запускать асинхронные задачи и обрабатывать изменения вращения с помощью индикаторов выполнения, которые повторно инициализируют себя.