【发布时间】:2018-02-01 18:19:09
【问题描述】:
我从 API 调用中获取多个对象,并尝试将它们显示到 ListView 中。
代码如下
public class ExerciseActivity extends AppCompatActivity {
private CompositeDisposable disposables = new CompositeDisposable();
private ExerciseClient exerciseClient;
private List<Exercise> exerciseList;
private Realm realm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_exercise);
exerciseList = new ArrayList<>();
this.realm = Realm.getDefaultInstance();
exerciseClient = new ExerciseClient(this);
populateExerciseList();
}
private void setupExerciseList() {
ListView lvItems = findViewById(R.id.lvItems);
ArrayAdapter<Exercise> adapter = new ArrayAdapter<>(this, R.layout.list_view, exerciseList);
lvItems.setAdapter(adapter);
}
void populateExerciseList() {
disposables.add(exerciseClient.getExercises()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
this::getExercisesSuccess,
this::getExercisesError
)
);
}
private void getExercisesError(Throwable throwable) {
exerciseList = realm.where(Exercise.class).findAll();
setupExerciseList();
}
private void getExercisesSuccess(List<Exercise> exercises) {
this.realm.executeTransaction(realm -> realm.where(Exercise.class).findAll().deleteAllFromRealm());
for (int i = 0; i < exercises.size(); i++) {
Exercise foundExercise = exercises.get(i);
this.exerciseList.add(foundExercise);
this.realm.executeTransactionAsync(realm -> realm.copyToRealmOrUpdate(foundExercise));
}
setupExerciseList();
}
列表只会加载 0 到 3-4 个元素,如果我评论 this.realm.executeTransactionAsync(realm -> realm.copyToRealmOrUpdate(foundExercise)); 行,列表会按预期加载。
请记住,我必须从 API 收集 1000 个对象。
我的猜测是 this.realm.executeTransactionAsync(realm -> realm.copyToRealmOrUpdate(foundExercise)); 的计算时间太长,因此在应用启动时我只得到
是否有任何可能的解决方法?
编辑:另外,我已经从数据库中删除了一些条目,只删除了大约 50 个条目,即使存在该行,它现在似乎也可以工作,所以问题肯定是大量数据。
【问题讨论】:
-
Rx 和 ListView?多么奇怪的组合:D 无论如何,请使用 github.com/realm/realm-android-adapters 中的
RealmBaseAdapter