В моем приложении у меня 1,46,000 записей, при применении библиотеки подкачки данные загружаются через 10 - 15 секунд. При применении фильтра к загруженным записям загрузка занимает минимум 5-10 секунд. Работа фильтра тихая задолго до того, как в моем проекте использовалась библиотека подкачки.
@ Dao класс выглядит следующим образом`
@Dao
public abstract class MftDao
{
@Query("SELECT* FROM transaction_master where AC_NO LIKE :acNo and TXN_ID LIKE :txn_id order by TXN_DATE DESC")
public abstract DataSource.Factory<Integer,TransactionMaster> getTotTransactions(String acNo,String txn_id);
}
ViewModel выглядит следующим образом
public class ReportViewModel extends AndroidViewModel {
private MutableLiveData<TransactionMasterFilter> filter = new MutableLiveData<>();
private LiveData<PagedList<TransactionMaster>> transactionMasterList;
public void setFilter(TransactionMasterFilter filter) {
this.filter.setValue(filter);
}
public ReportViewModel(@NonNull Application application) {
super(application);
repository = new Repository(application);
mftDao = MftDataBase.getInstance(application).getMftDao();
}
public void init() {
transactionMasterList = Transformations.switchMap( filter, new Function<TransactionMasterFilter, LiveData<PagedList<TransactionMaster>>>() {
@Override
public LiveData<PagedList<TransactionMaster>> apply(TransactionMasterFilter input)
{
DataSource.Factory<Integer,TransactionMaster> transactionMasterFactory;
PagedList.Config pagedListConfig =
(new PagedList.Config.Builder()).setEnablePlaceholders(true)
.setPrefetchDistance(150)
.setPageSize(50).build();
transactionMasterFactory = mftDao.getTotTransactions(input.acNo,input.Txn_id);
return new LivePagedListBuilder(transactionMasterFactory,pagedListConfig).build();
}
} );
}
public static class TransactionMasterFilter
{
public String Txn_id;
public String acNo;
public void setTxn_id(String txn_id) {
Txn_id = "%"+txn_id+"%";
}
public void setAcNo(String acNo) {
this.acNo = "%"+acNo+"%";
}
public TransactionMasterFilter(String txn_id, String acNo) {
Txn_id = txn_id;
this.acNo = acNo;
}
}
public LiveData<PagedList<TransactionMaster>> getTransactionMasterList() {
return transactionMasterList;
}
}
Наконец, активность равна
public class DailyReportActivity extends AppCompatActivity {
ActivityDailyReportBinding dailyReportBinding;
List<TransactionMaster> transactionMasterList = new ArrayList<>();
Repository repository;
ReportViewModel reportViewModel;
ReportViewModel.TransactionMasterFilter transactionMasterFilter = new ReportViewModel.TransactionMasterFilter("%%","%%");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
dailyReportBinding = DataBindingUtil.setContentView(this, R.layout.activity_daily_report );
reportViewModel = ViewModelProviders.of(this).get( ReportViewModel.class);
reportViewModel.setFilter(transactionMasterFilter);
reportViewModel.init();
dailyReportBinding.recyclerView.setItemAnimator(new DefaultItemAnimator());
dailyReportBinding.recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false));
final DailyReportAdapter dailyReportAdapter = new DailyReportAdapter();
dailyReportBinding.recyclerView.setAdapter(dailyReportAdapter);
reportViewModel.getTransactionMasterList().observe( this, new Observer<PagedList<TransactionMaster>>() {
@Override
public void onChanged(PagedList<TransactionMaster> transactionMasters) {
Log.e("",String.valueOf(transactionMasters.getLoadedCount()) + ",Tot = "+ transactionMasters.size());
dailyReportAdapter.submitList(transactionMasters);
}
});
dailyReportBinding.acNoAutoCompleteTextView.addTextChangedListener( new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
String acNo = dailyReportBinding.acNoAutoCompleteTextView.getText().toString();
transactionMasterFilter.setAcNo(acNo);
reportViewModel.setFilter(transactionMasterFilter);
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
}
Я много пытался найти решение, но не получил его. Нужно ли добавлять индексы или Процедура наблюдения за LiveData совершенно неверна? , Пожалуйста, дайте мне предложения, спасибо за ваше время