Получение Ссылки на Активность вызовов от AsyncTask (НЕ как внутренний класс)

Это вообще возможно из AsyncTask, который НЕ является внутренним классом класса активности вызовов, для получения ссылки на экземпляр Действия, которое инициировало казнь AsyncTask?

Я знаю об этом потоке, однако он точно не обращается, как сослаться на активность вызовов. Некоторые предлагают передать ссылку на Действие в качестве параметра конструктору AsyncTask, однако, сообщается, что выполнение так будет всегда приводить к NullPointerException.

Так, я в замешательстве. Мой AsyncTask обеспечивает надежную функциональность, и я не хочу должным быть копировать его как внутренний класс в каждом Действии, которое хочет использовать его. Должно быть изящное решение.

6
задан Community 23 May 2017 в 12:26
поделиться

2 ответа

"Элегантное решение" состоит в том, чтобы на самом деле попробовать передать его в качестве параметра (конструктору или execute () ) и посмотреть, работает ли это, вместо того, чтобы предполагать, что человек, который задал этот предыдущий вопрос (затем дважды ответил на свой вопрос), знает, что он делает. Я не могу придумать ничего, присущего AsyncTask , что сделало бы Activity плохим параметром конструктора, и все остальные объекты были бы в порядке.

Я не передал Activity (или другой Контекст ) в качестве параметра для AsyncTask , потому что мои AsyncTasks всегда являются частными внутренними классами. Фактически, тот факт, что вы хотите общедоступную AsyncTask , для меня является запахом кода, предполагающим, что эти задачи должны выполняться службой или какой-либо другой контрольной точкой. . Но это только я.

ОБНОВЛЕНИЕ

Лучший ответ для обработки этого шаблона можно найти здесь: Фоновая задача, диалог выполнения, изменение ориентации - есть ли какое-нибудь 100% рабочее решение?

10
ответ дан 8 December 2019 в 17:19
поделиться

Мои 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;
    }

}
4
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: