Firebase запрос занимает слишком много времени - PullRequest
0 голосов
/ 25 сентября 2019

Я выполняю запрос к базе данных Firebase.Я пытаюсь получить профили по имени вложенного дочернего элемента для каждого нажатия клавиши на клавиатуре для SearchView.Я также использую задержку 1500 мсек между каждым вызовом, поэтому я не буду звонить много раз.Я пытаюсь понять, почему этот запрос занимает слишком много времени.

вот мой запрос -


private void fetchUsersFromTextSearch(String text) {
    Query query = FirebaseDatabase.getInstance().getReference().child("profiles").orderByChild("name").startAt(text).endAt(text + "\uf8ff");
    query.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        mProgressBar.setVisibility(View.GONE);
        if (dataSnapshot.exists()) {
          ArrayList<ExploreSearchUser> fetchedUsers = new ArrayList<>();
          for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
            String name = snapshot.child("name").getValue(String.class);
            String photoUrl = snapshot.child("photoUrl").getValue(String.class);
            String UID = dataSnapshot.getKey();
            ExploreSearchUser searchUser = new ExploreSearchUser(name, photoUrl, UID);
            fetchedUsers.add(searchUser);
            Timber.tag("similar users - ").d("name - " + name + "\n" + "photoUrl - " + photoUrl + "\n" + "UID - " + UID);
          }
          if (fetchedUsers.size() > 0) {
            searchUsersList.clear();
            searchUsersList.addAll(fetchedUsers);
            mSearchResultTextTitle.setText(App.getAppContext()
                .getString(R.string.explore_search_activity_profiles_containing_search_result).concat(text).concat("'"));
            adapter.notifyDataSetChanged();
          }
        } else {
          mSearchResultTextTitle.setText(App.getAppContext().getString(R.string.explore_search_activity_no_profiles_containing).concat(text).concat("'"));
        }
      }

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {
        mProgressBar.setVisibility(View.GONE);
        mSearchResultTextTitle.setText("Error - " + databaseError.getMessage());
        Timber.tag("similar users error - " + databaseError.getMessage());
      }
    });
  }


Проблема заключается в том, что слишком долго, чтобы вернуть результаты в мой обзор переработчика.Примерно 10-15 секунд для каждого поиска, который можно использовать с пользой.Я спрашиваю что-то не так?

вот место, где я вызываю свою функцию -


mSearchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
      @Override
      public boolean onQueryTextSubmit(String query) {
        return false;
      }

      @Override
      public boolean onQueryTextChange(String newText) {
        if (newText.length() == 1) {
          mSearchResultTextTitle.setText(App.getAppContext().getString(R.string.explore_search_activity_can_perform_search_limitation));
          return false;
        } else if (newText.length() > 1) {
          mSearchResultTextTitle.setText(App.getAppContext().getString(R.string.explore_search_activity_searching).concat(newText).concat("'..."));
          mProgressBar.setVisibility(View.VISIBLE);
        } else {
          mSearchResultTextTitle.setText(App.getAppContext().getString(R.string.explore_search_activity_fetching_recommended_profiles));
          mProgressBar.setVisibility(View.VISIBLE);
        }
        searchTimer.cancel();
        searchTimer = new Timer();
        //timer task that delays network calls for better performance
        TimerTask timerTask = new TimerTask() {
          @Override
          public void run() {
            runOnUiThread(() -> { //TODO - check this thread issue
              searchUsersList.clear();
              adapter.notifyDataSetChanged();
              if (newText.length() < 1) {
                mSearchResultTextTitle.setText(App.getAppContext().getString(R.string.explore_search_activitty_recommended_profiles));
                fetchSixRandomProfiles();
              } else {
                fetchUsersFromTextSearch(newText);
              }
            });
          }
        };
        searchTimer.schedule(timerTask, SEARCH_WITH_DELAY);
        return false;
      }
    });

, поэтому мои вопросы - 1) Что заставляет запрос занимать так много времени?2) Как я могу добавить игнорирование чувствительности к регистру для моего запроса?Я видел несколько потоков об этой проблеме, но ничто не решило мою проблему, так как большинство из них сказали, что я должен получить всю таблицу и использовать «.toUppercase ()» для соответствующих строк ... что не является решением в моем случае, так как мойтаблица имеет 22k значений.Есть идеи, как мне это сделать?

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