При получении данных и сохранении их в sqlite db пользовательский интерфейс моего приложения зависает - PullRequest
0 голосов
/ 12 февраля 2020

Здравствуйте, мое приложение останавливает пользовательский интерфейс на несколько секунд, пока оно извлекает данные из сети и сохраняет их в БД, а затем показывает их в программе просмотра. Для извлечения данных из сети я использую модификацию, для ее хранения и извлечения из библиотеки db Room. Оба с помощью шаблона MVVM. Есть ли способ снять заморозку пользовательского интерфейса? Вот мой код:

В Mainactivity при нажатии загрузить btn

downloadBtn.setOnClickListener(v -> 
  eventsViewModel.insertEvents(this));

Класс представления модели:

public void insertEvents(Context context){

        final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

        String token = preferences.getString("token", "");

        final Map<String,String> queryData = new HashMap<>();
        queryData.put("token", token);
        Call<EventsResponse> call = RetrofitClient.getmInstance().getApi().getEvents(queryData);
        call.enqueue(new Callback<EventsResponse>() {
            @Override
            public void onResponse(Call<EventsResponse> call, Response<EventsResponse> response) {

                if (response.code() == 401){


                    String email = preferences.getString("email", "");
                    String password = preferences.getString("password", "");

                    Call<LoginResponse> call1 = RetrofitClient.getmInstance().getApi().loginuser(email, password);
                    call1.enqueue(new Callback<LoginResponse>() {
                        @Override
                        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
                            if (response.code() == 200){

                                SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context); // 0 - for private mode
                                SharedPreferences.Editor editor = pref.edit();
                                editor.putString("token", response.body().getToken());
                                editor.apply();

                                insertEvents(context);

                            }
                            else {

                            }
                        }

                        @Override
                        public void onFailure(Call<LoginResponse> call, Throwable t) {

                        }
                    });
                }

                if (response.code() == 200){
                    eventList = response.body().getData();

                    EventsTable eventsTable = new EventsTable();

                    TicketDatesTable ticketDatesTable = new TicketDatesTable();

                    for (int i = 0; i < eventList.size(); i++) {

                        eventsTable.setEvent_id(eventList.get(i).getId());
                        eventsTable.setTitle_tk(eventList.get(i).getTitle_tk());
                        eventsTable.setTitle_ru(eventList.get(i).getTitle_ru());
                        eventsTable.setImageURL("https://bilettm.com/" + eventList.get(i).getImage_url());
                        eventsTable.setStart_date(eventList.get(i).getStart_date());
                        eventsTable.setEnd_date(eventList.get(i).getEnd_date());
                        eventsTable.setSales_volume(eventList.get(i).getEnd_date());
                        eventsTable.setOrganiser_fees_volume(eventList.get(i).getOrganiser_fees_volume());
                        eventsTable.setViews(eventList.get(i).getViews());
                        eventsTable.setSales_volume(eventList.get(i).getSales_volume());
                        eventsTable.setIs_live(eventList.get(i).getIs_live());

                        if (!eventList.get(i).getTicket_dates().isEmpty()) {

                            showTimeList = eventList.get(i).getTicket_dates();
                            int b = 0;
                            while (b < showTimeList.size()) {
                                ticketDatesTable.setEvent_id(showTimeList.get(b).getEvent_id());

                                ticketDatesTable.setTicket_date(showTimeList.get(b).getTicket_date());

                                insertTicketDates(ticketDatesTable);

                                try {

                                    Thread.sleep(150);

                                } catch (InterruptedException ex) {

                                    Thread.currentThread().interrupt();

                                }


                                b++;
                            }

                        }
                        insert(eventsTable);
                        try {
                            Thread.sleep(150);
                        } catch (InterruptedException ex) {
                            Thread.currentThread().interrupt();
                        }

                    }
                }
            }
            @Override
            public void onFailure(Call<EventsResponse> call, Throwable t) {

            }
        });

    }

public void insert(EventsTable data){
        repository.insertEvents(data);
    }

    public void insertTicketDates(TicketDatesTable ticketDatesTable){
        repository.insertTicketDates(ticketDatesTable);

Вот мой репозиторий:

public void insertEvents(EventsTable data){
    new EventInsertion(eventsDAO).execute(data);
}
private static class EventInsertion extends AsyncTask<EventsTable, Void, Void> {

    private EventsDAO eventsDAO;

    private EventInsertion(EventsDAO eventsDAO) {
        this.eventsDAO = eventsDAO;
    }


    @Override
    protected Void doInBackground(EventsTable... eventsTables) {
        eventsDAO.insertEvents(eventsTables[0]);

        return null;
    }
}

public void insertTicketDates(TicketDatesTable data){
    new TicketDatesInsertion(eventsDAO).execute(data);
}
private static class TicketDatesInsertion extends AsyncTask<TicketDatesTable, Void, Void> {

    private EventsDAO eventsDAO;

    private TicketDatesInsertion(EventsDAO eventsDAO) {
        this.eventsDAO = eventsDAO;
    }


    @Override
    protected Void doInBackground(TicketDatesTable... ticketDatesTables) {
        eventsDAO.insertTicketDates(ticketDatesTables[0]);
        return null;
    }
}

Вот мой DAO:

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertEvents(EventsTable data);

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertTicketDates(TicketDatesTable datesTable);

Я думаю, что он зависает при сохранении в sqlite db

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Я нашел свою проблему. Он инициализировал сущность перед запуском для l oop:

ДО:

EventsTable eventsTable = new EventsTable();

for (int i = 0; i < eventList.size(); i++) {
       INSERT();

     }

ПОСЛЕ:

  for (int i = 0; i < eventList.size(); i++) {
             EventsTable eventsTable = new EventsTable();
             INSERT();
     }
0 голосов
/ 12 февраля 2020

Лучшим решением было бы собрать все необходимые объекты в ArrayList, а затем передать его в AsyncTask и оттуда в DAO для массовой вставки.

И удалить всю тему .sleep (150) заявления, поскольку они не имеют смысла.

0 голосов
/ 12 февраля 2020

почему вы используете этот Thread.sleep (150); вызов уже является фоновой задачей при модернизации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...