Поскольку загрузчики были объявлены устаревшими с Android P (API 28), как указано здесь : загрузчики, я решил использовать ViewModel
и LiveData
в моем приложении, но, к сожалению, естьК счастью, я нашел этот пост blog , в котором говорится об этом.
используется OrmLite в MainActivity
ItemsDBHelper itemsDBHelper;
private static RuntimeExceptionDao<Item, Integer> runtimeExceptionDaoItems;
для хранения / кэширования данных. Я использовал AsyncTask следующим образом
static class SaveInDatabase extends AsyncTask<Item, Void, Void> {
@Override
protected Void doInBackground(Item... items) {
List<Item> itemsList = Arrays.asList(items);
runtimeExceptionDaoItems.create(itemsList);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// itemsDBHelper.close();
}
}
и для извлечения:
runtimeExceptionDaoItems.queryForAll()
В настоящее время я использовал обратный вызов для модификации данных, чтобы получить данные с сервера, если есть соединение, и сохранить их в БД, чтобы при отсутствии соединения мы извлекали данные из базы данных
final Call<PostList> postList = BloggerAPI.getService().getPostList(url);
postList.enqueue(new Callback<PostList>() {
@Override
public void onResponse(@NonNull Call<PostList> call, @NonNull Response<PostList> response) {
if (response.isSuccessful()) {
progressBar.setVisibility(View.GONE);
PostList list = response.body();
if (list != null) {
token = list.getNextPageToken();
items.addAll(list.getItems());
adapter.notifyDataSetChanged();
SaveInDatabase task = new SaveInDatabase();
Item[] listArr = items.toArray(new Item[0]);
task.execute(listArr);
}
} else {
progressBar.setVisibility(View.GONE);
recyclerView.setVisibility(View.GONE);
emptyView.setVisibility(View.VISIBLE);
int sc = response.code();
switch (sc) {
case 400:
Log.e("Error 400", "Bad Request");
break;
case 404:
Log.e("Error 404", "Not Found");
break;
default:
Log.e("Error", "Generic Error");
}
}
}
@Override
public void onFailure(@NonNull Call<PostList> call, @NonNull Throwable t) {
Toast.makeText(MainActivity.this, "Error occured", Toast.LENGTH_LONG).show();
Log.e(TAG, "onFailure: " + t.toString());
Log.e(TAG, "onFailure: " + t.getCause());
}
});
, в настоящее время я создаю ItemViewModelКласс и настроенный для приложения, как это:
public class ItemViewModel extends AndroidViewModel {
private final String TAG = this.getClass().getName();
private LiveData<List<Item>> listItems;
public ItemViewModel(@NonNull Application application) {
super(application);
}
public class ItemLiveData extends LiveData<List<Item>> {
private final Context context;
public ItemLiveData(Context context) {
this.context = context;
loadData();
}
// Here data must be called either from the server (Retrofit) or from the database
private void loadData() {
new AsyncTask<Void,Void,List<Item>>() {
@Override
protected List<Item> doInBackground(Void... voids) {
List<Item> items = new ArrayList<>();
return items;
}
@Override
protected void onPostExecute(List<Item> items) {
super.onPostExecute(items);
}
}.execute();
}
}
}
и он используется следующим образом
ItemViewModel model =
ViewModelProviders.of(this).get(Item.class);
model.getData().observe(this, data -> {
// update UI
});
В предыдущем классе Какой метод я должен использовать для хранения данных в нем?