Async вызывается веб-сервером для получения обновленных данных и уведомляет адаптер , чтобы обновить весь список. Это кажется неэффективным, поскольку вызов для списка может занять пару секунд.
Как вы говорите, это очень неэффективно. Создание объекта дорого стоит в Android.Создание списка многих объектов намного дороже.
Приобретая профиль, храните объект где-нибудь (возможно, в службе singleton), помеченной как 'refresh'. OnResume в активности списка вы нюхаете переменную и обновляете только этот элемент в списке.
Это нехорошее решение, потому что существует вероятность того, что приложение завершится с ошибкой, прежде чем мы обновим объект или приложение будет убито устройством.
Убедитесь, что массив списка является статическим. Обновите массив из операции . OnResume в активности всегда уведомляет адаптер для обновления.
Обновление массива с помощью статического метода или переменной не является хорошим решением, поскольку оно делает вашу детальную активность связанной со списком. Кроме того, вы не можете удостовериться, что только детализация активности, которая изменит список, если ваш проект станет больше.
Убедитесь, что массив и адаптер списка являются статическими. Обновите массив и уведомите адаптер об активности детали.
То же, что и выше, статическая переменная или объект - это не выход.
Лучше использовать систему автобусов, например EventBus.
Всякий раз, когда вы нажимаете на кнопку 'add to favourite'
, отправьте запрос async для обновления избранного веб-сервера, а также отправьте событие в список для обновления определенного объекта профиля. Например, если ваша компания имеет идентификатор «777» и профиль Добавлен в избранное подробно деятельности, то вам нужно отправить что-то событие, как это в:
btnFavourite.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Send event when click favourite.
EventBus.getDefault.post(new RefreshProfileEvent(id, true);
}
});
RefreshProfileEvent простой POJO:
public class RefreshProfileEvent {
private String id;
private boolean isFavourited;
public RefreshProfileEvent(String id, boolean isFavourited) {
this.id = id;
this.isFavourited = isFavourited;
}
//getter and setter
}
Тогда вы можете получить событие в списке вашей деятельности, чтобы обновить выбранный профиль:
public class YourListActivity {
...
@Override
protected onCreate() {
...
EventBus.getDefault().register(this);
}
@Override
protected onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(RefreshProfileEvent event) {
// Refresh specific profile
// For example, your profile is saved in List<Profile> mProfiles
// Search for profile by its id.
for(int i = 0; i < mProfiles.size(); i++) {
if(mProfiles.getId().equals(event.getId()) {
// Refresh the profile in the adapter.
// I assume the adapter is RecyclerView adapter named mAdapter
mProfiles.get(i).isFavourited(true);
mAdapter.notifyItemChanged(i);
// Stop searching.
break;
}
}
}
Вам не нужно ждать As Результат запроса yncTask, возвращаемый сервером. Просто сделайте профиль первым и не ожидая результата. Если ваш запрос успеха, не делайте ничего. Но если ошибка запроса, сделайте профиль невозбужденным и отправьте сообщение об ошибке, например SnackBar, чтобы сообщить пользователю.
Это действительно замечательный подробный ответ. Спасибо. Я еще не слышал или не использовал EventBus, но я, конечно, начну использовать его с этого момента. – user2694255
добро пожаловать. Существует также RxJava, но я не использовал его раньше. –