After parsing the JSON data with the help of Volley library, I want to save it to Room. Since the process was taking too long (about 45 seconds) I put this inside a Service. In the same way, I was using AsyncTask to prevent the insert operation from freezing the interface. However, I decided to use RxJava because it is deprecated, but I did not understand most things. Can you help to create useful content?
Here are some questions;
- In which case we should use Observable and in which case Single structure?
- .observeOn(AndroidSchedulers.mainThread())if we don't have work with mainThread, like in my example (running in service) then what should we do?
- Do you really need it? I mean, we could handle this very easily with a really complicated AsyncTask.
Please share your knowledge (in Java please) make it a good article for readers
Thanks in advance
public class ScheduledService extends Service {
FoodDatabase appDatabase;
List<FoodArray> foodsArray;
 @Override
   public void onCreate() {
       super.onCreate();
       foodsArray = new ArrayList<>();
       appDatabase = Room.databaseBuilder(this, FoodDatabase.class, "FoodListDatabase_TEST.db")
               .fallbackToDestructiveMigration()
               .allowMainThreadQueries()
               .build();
       getFoodRequest();
}
   public void getFoodRequest() {
       Log.d("TAG_JSON_FOOD_DB", "--------------------------------");
       @SuppressLint("SetJavaScriptEnabled") JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
               Constant.FOOD_LIST_JSON, null,
               response -> {
                   long start = System.currentTimeMillis();
                   try {
                       JSONArray jsonArray = response.getJSONArray("MyData");
                       for (int i = 0; i < jsonArray.length(); i++) {
                           JSONObject object = jsonArray.getJSONObject(i);
                           FoodArray foodArray = new FoodArray();
                           List<FoodUnitsData> foodUnitList = new ArrayList<>();
                           FoodsData foodsData = new FoodsData();
                           foodsData.setFoodId(object.getString("food_id"));
                           foodsData.setFoodName(object.getString("food_name"));
                           foodsData.setFoodImage(object.getString("food_image"));
                           foodsData.setFoodUrl(object.getString("food_url"));
                           foodsData.setFoodKcal(object.getString("food_kcal"));
                           foodsData.setFoodDescription(object.getString("food_description"));
                           foodsData.setCarbPercent(object.getString("carb_percent"));
                           foodsData.setProteinPercent(object.getString("protein_percent"));
                           foodsData.setFatPercent(object.getString("fat_percent"));
                           JSONArray jsonUnitsArray = object.getJSONArray("units");
                           for (int k = 0; k < jsonUnitsArray.length(); k++) {
                               JSONObject unitobject = jsonUnitsArray.getJSONObject(k);
                               FoodUnitsData foodUnitData = new FoodUnitsData();
                               foodUnitData.setUnit(unitobject.getString("unit"));
                               foodUnitData.setAmount(unitobject.getString("amount"));
                               foodUnitData.setCalory(unitobject.getString("calory"));
                               foodUnitData.setCalcium(unitobject.getString("calcium"));
                               foodUnitData.setCarbohydrt(unitobject.getString("carbohydrt"));
                               foodUnitData.setCholestrl(unitobject.getString("cholestrl"));
                               foodUnitData.setFiberTd(unitobject.getString("fiber_td"));
                               foodUnitData.setIron(unitobject.getString("iron"));
                               foodUnitData.setLipidTot(unitobject.getString("lipid_tot"));
                               foodUnitData.setPotassium(unitobject.getString("potassium"));
                               foodUnitData.setProtein(unitobject.getString("protein"));
                               foodUnitData.setVitAIu(unitobject.getString("vit_a_iu"));
                               foodUnitData.setVitC(unitobject.getString("vit_c"));
                               foodUnitList.add(foodUnitData);
                           }
                           foodArray.setFoods(foodsData);
                           foodArray.setFoodUnits(foodUnitList);
                         foodsArray.add(foodArray);
                           //insertData(foodArray);
                       }
                   
                       insertData(foodsArray);
                       long finish = System.currentTimeMillis();
                       Log.d("TAG_JSON_FOOD_DB", "   \t" + (finish - start));
                       Log.d("TAG_JSON_FOOD_DB", "   \t" + "******************\n");
                   } catch (JSONException e) {
                       e.printStackTrace();
                       Log.d("TAG_JSON_FOOD", "e:" + e);
                   }
               }, error -> {
           Log.d("TAG_JSON_FOOD", error.toString());
       });
       jsonObjectRequest.setShouldCache(false);
       jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
       RequestQueue request_queue = Volley.newRequestQueue(context);
       request_queue.add(jsonObjectRequest);
   }
   private void insertData(List<FoodArray> foodArray) {
       Observable.fromCallable(() -> {
           for (int i = 0; i < foodArray.size(); i++) {
               appDatabase.daoAccess().insertAll(foodArray.get(i));
           }
           return appDatabase.daoAccess().getAll();
       })
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer< List<FoodArray>>() {
                   @Override
                   public void onSubscribe(@NonNull Disposable d) {
                       Log.d("TAG_JSON_FOOD_DB",  "***dis*****"+ d);
                   }
                   @Override
                   public void onNext(@NonNull  List<FoodArray> list) {
                       Log.d("TAG_JSON_FOOD_DB",  "***size*****"+ list.size());
                   }
                   @Override
                   public void onError(@NonNull Throwable e) {
                   }
                   @Override
                   public void onComplete() {
                       Log.d("TAG_JSON_FOOD_DB",  "***complete*****");
                   }
               });
   }
public void test(){
       Single.just(foodArray)
               .subscribeOn(Schedulers.io())
               .subscribe(new DisposableSingleObserver<Object>() {
                   @Override
                   public void onSuccess(Object obj) {
                       // work with the resulting todos...
                       dispose();
                   }
                   @Override
                   public void onError(Throwable e) {
                       // handle the error case...
                       dispose();
                   }});
}
}
Error
@Override
public void onComplete() {
    Log.d("TAG_JSON_FOOD_DB", "***complete*****");
     ///onDestroy();
}