я смотрел на примерах того, как использовать адаптер для обработки живого запроса здесь: ToDoLite-Android LiveQueryAdapter, и у меня есть вопрос относительно этой части:Сохранения контекста в адаптере, когда это кажется излишним
private LiveQuery query;
private QueryEnumerator enumerator;
private Context context;
public LiveQueryAdapter(Context context, LiveQuery query) {
this.context = context;
this.query = query;
query.addChangeListener(new LiveQuery.ChangeListener() {
@Override
public void changed(final LiveQuery.ChangeEvent event) {
((Activity) LiveQueryAdapter.this.context).runOnUiThread(new Runnable() {
@Override
public void run() {
enumerator = event.getRows();
notifyDataSetChanged();
}
});
}
});
query.start();
}
В нескольких действиях он использовал адаптеры, которые расширяют LiveQueryAdapter. Адаптеры были инициализированы путем передачи активности и живого запроса.
here Примеры:
// 'this' are all activities, I think
mAdapter = new ListAdapter(this, query.toLiveQuery());
mAdapter = new UserAdapter(this, getQuery().toLiveQuery());
mAdapter = new TaskAdapter(this, query.toLiveQuery());
Так вот мой вопрос: Почему мы должны хранить этот контекст в застройщик? Это как-то связано с runOnUiThread? Почему бы просто не сделать это:
((Activity)context).runOnUiThread(...
Я не вижу хранимую переменной контекста, используемого в другом месте, но в этой одной строке, так зачем сохранить его?
Я знаю, что контекст, вероятно, может быть использован в getView(), но его/ее код использует parent.getContext(). Кроме того, в моем коде я использую RecyclerView вместо ListView, поэтому у меня даже нет метода getView(), который я не думаю.
Да, вы можете сделать то, что вам сказали. Я думаю, что это просто для других, чтобы понять, что происходит в коде, но не имеет значения. Но, возможно, внутри функции вам нужно будет использовать переменную с «финальной» подписью. – aleksandrbel