Это вообще возможно из AsyncTask, который НЕ является внутренним классом класса активности вызовов, для получения ссылки на экземпляр Действия, которое инициировало казнь AsyncTask?
Я знаю об этом потоке, однако он точно не обращается, как сослаться на активность вызовов. Некоторые предлагают передать ссылку на Действие в качестве параметра конструктору AsyncTask, однако, сообщается, что выполнение так будет всегда приводить к NullPointerException.
Так, я в замешательстве. Мой AsyncTask обеспечивает надежную функциональность, и я не хочу должным быть копировать его как внутренний класс в каждом Действии, которое хочет использовать его. Должно быть изящное решение.
"Элегантное решение" состоит в том, чтобы на самом деле попробовать передать его в качестве параметра (конструктору или execute ()
) и посмотреть, работает ли это, вместо того, чтобы предполагать, что человек, который задал этот предыдущий вопрос (затем дважды ответил на свой вопрос), знает, что он делает. Я не могу придумать ничего, присущего AsyncTask
, что сделало бы Activity
плохим параметром конструктора, и все остальные объекты были бы в порядке.
Я не передал Activity
(или другой Контекст
) в качестве параметра для AsyncTask
, потому что мои AsyncTasks
всегда являются частными внутренними классами. Фактически, тот факт, что вы хотите общедоступную AsyncTask
, для меня является запахом кода, предполагающим, что эти задачи должны выполняться службой
или какой-либо другой контрольной точкой. . Но это только я.
ОБНОВЛЕНИЕ
Лучший ответ для обработки этого шаблона можно найти здесь: Фоновая задача, диалог выполнения, изменение ориентации - есть ли какое-нибудь 100% рабочее решение?
Мои AsyncTask
всегда находятся в отдельном пакете, но все еще привязаны к определенному типу Activity
. Они принимают его экземпляр в конструкторе и хранят в локальной переменной.
Попробуйте подумать о создании абстрактного класса Activity
, который инкапсулирует материал, связанный с AsyncTask
, и расширяется другими действиями.
Примерно так:
public abstract RemoteListActivity<T> extends ListActivity{
// calls AsyncTask, shows spinning progress dialog, etc
protected abstract T someConcreteMethod();
}
public final class CustomerListActivity extends RemoteListActivity<Customer>{
protected final Customer someConcreteMethod();
}
В качестве альтернативы, если что-то не вписывается в единую иерархию, используйте интерфейс:
interface LazyLoadable {
void setLoadingState();
void setDefaultState();
}
public class MyActivity extends Activity implements LazyLoadable{
}
public final class AsyncTask extends AsyncTask<Void, Void, Void>{
private final LazyLoadable lazyLoadable;
public MyAsyncTask(Context ctx, LazyLoadable lazyLoadable){
super(ctx);
this.lazyLoadable = lazyLoadable;
}
}