Модернизация Android: я хочу обновлять или дополнять данные каждый день в определенное время или раз в день, извлеченные данные успешно и локально работают в автономном режиме

#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 — его лучшее решение.