#android #android-studio #retrofit #android-service #android-room
#Android #android-studio #модернизация #android-сервис #android-room
Вопрос:
Я хочу обновлять эти данные или обновлять данные каждый день, но в определенное время дня или один раз в день я могу сказать, что,
как я могу этого добиться?
какому методу я должен следовать, вот код
активность фрагмента
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
cm = (ConnectivityManager) getActivity()
.getApplicationContext()
.getSystemService(
Context.CONNECTIVITY_SERVICE
);
activeNetwork = cm.getActiveNetworkInfo();
apiCallInterface = ApiService.createService(ApiCallInterface.class);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
datumList = new ArrayList<>();
recyclerView = view.findViewById(R.id.retroRecyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
fetchFromDb();
}
private void fetchFromDb() {
Gson gson = new Gson();
String array = sharedPreferences.getString("category", "");
Type type = new TypeToken<List<Datum>>() {
}.getType();
datumList = gson.fromJson(array, type);
if (datumList != null) {
retrofitAdapter = new RetrofitAdapter(getContext(), datumList);
recyclerView.setAdapter(retrofitAdapter);
} else {
if (activeNetwork != null
amp;amp; activeNetwork.isConnectedOrConnecting()) {
fetchFromServer();
} else {
Toast.makeText(getActivity(), "Internet not available", Toast.LENGTH_SHORT).show();
}
}
}
private void fetchFromServer() {
Call<MenuResponse> call = apiCallInterface
.getResponseData(data);
call.enqueue(new Callback<MenuResponse>() {
@Override
public void onResponse(Call<MenuResponse> call, Response<MenuResponse> response) {
datumList = (ArrayList<Datum>) response.body().getData();
Gson gson = new Gson();
editor = sharedPreferences.edit();
editor.putString("category", gson.toJson(datumList));
editor.apply();
retrofitAdapter = new RetrofitAdapter(getContext(), datumList);
recyclerView.setAdapter(retrofitAdapter);
}
@Override
public void onFailure(Call<MenuResponse> call, Throwable t) {
Log.d(TAG, "onFailure something went wrong" t.getLocalizedMessage());
Toast.makeText(getContext(), "Something went wrong!", Toast.LENGTH_SHORT).show();
}
});
}
эти два метода я использовал для временного сначала я использовал room DB bt для temp. задача, которую я попробовал, общие настройки теперь я хочу выполнить задачу обновления или актуализации данных, обновляя данные один раз в день или в определенное время дня
Ответ №1:
Вы можете использовать WorkManager для такого рода вещей.
Здесь вы можете найти более подробную информацию об этом.
Просто имейте в виду, что на некоторых устройствах, таких как Xiaomi, ваша задача может никогда не сработать, если приложение находится в фоновом режиме (не запущено). Но WorkManager на данный момент является самым надежным. Вероятно, это выполняет задачу с некоторой задержкой, но, по крайней мере, ваша задача выполняется (все еще говоря об устройствах с пользовательской ОС). На других устройствах (стандартный Android) вы можете использовать как WorkManager, так и AlarmManager.
Ответ №2:
это работает абсолютно нормально!!
public void runOnceADay() {
Calendar calendar = Calendar.getInstance();
int currentDay = calendar.get(Calendar.DAY_OF_MONTH);
sharedPreferences = getActivity().getSharedPreferences("PREFS", 0);
int lastDay = sharedPreferences.getInt("day", 0);
if (lastDay != currentDay) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt("day", currentDay);
editor.commit();
//perform task ...
Log.d("day", "updated!");
fetchFromServer();
} else {
Log.d("day", "task will be performed tomorrow!");
fetchFromDb();
}
}
Комментарии:
1. Это будет работать, но не тогда, когда приложение работает в фоновом режиме, я думаю, что OP хочет, чтобы это работало в фоновом режиме, поэтому Workmanager — его лучшее решение.