Пожалуйста, не закрывайте это, ИМХО это приличный и, возможно, полезный вопрос программирования.Android: лучшая практика для выполнения асинхронных операций в getView()
Пожалуйста, я читаю много вещей, и я сбиваюсь с толку, потому что читаю разные мнения и разные подходы.
Проблема заключается в следующем:
в getView()
в качестве Adapter
мне нужно выполнить некоторые асинхронные операции, как проверка в образование в Интернете, и обновить представление, основанное на этом.
Я использовал следующий подход:
каждый раз getView()
называется я начать Thread
, но мой подход, как заработал мне много критики:
https://stackoverflow.com/a/28484345/1815311
https://stackoverflow.com/a/28484335/1815311
https://stackoverflow.com/a/28484351/1815311
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
//...
}
else {
//...
}
Thread th= new Thread(new Runnable() {
@Override
public void run() {
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
CheckSomeInfoOverTheInternet(url, new myCallback {
@Override
public void onSuccess() {
holder.textview.setText("OK");
}
@Override
public void onFailre() {
holder.textview.setText("NOT OK!!!!");
}
});
}
});
}
});
th.start();
return convertView;
}
Пожалуйста, что было бы лучше всего для такого?
Пожалуйста, обратите внимание, я не ищу решение для выполнения сетевых запросов в getView()
, но, скорее, как обновленный вид в зависимости от результата на асинхронный вызов.
главная проблема: WT * является 'CheckSomeInfoOverTheInternet' isin't это ASync уже? ... нормальный путь: создать обработчик в потоке пользовательского интерфейса (позволяет называть его UIHandler) ... создавать HandlerThread (HT) ... отправлять долго работающие вещи в HT с некоторым обратным вызовом ... если HT позаботится о своем вызове работы обратный вызов с использованием UIHandler ... конец истории .. – Selvin
Из вашего вопроса выше вы говорите, что даже если вы выполняете асинхронную операцию в вашем getView, вам все равно придется ждать результатов, так как вы используете указанные результаты для обновления Ваше мнение. Это так? Я думаю, что лучший подход - это выполнить вашу асинхронную операцию перед обновлением вашего представления, а затем просто передать результаты в 'getView'. Таким образом, вы не ожидаете выполнения операции из 'getView' – Willis
... конечно, только один UIHandler и HandlerThread для каждого адаптера - не для вызова getView ... также это почти то же самое, что и под AsyncTask (новый один с исполнителем) ... и runOnUiThread - это не что иное, как публикация runnable для обработчика UI – Selvin