IntentService аварийно завершает работу systemUI

У меня есть IntentService, который должен отправлять тысячи запросов на волейбол на мой сервер. Работает нормально и очень быстро. Я создаю свои запросы на основе курсора, полученного от ContentProvider (getContentResolver()).

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

List<List> savedLyrics = DatabaseHelper.getInstance(this).listMetadata();

Если этот список пуст, он работает нормально. Однако, если это не так - то когда этот метод

savedLyrics.contains(Arrays.asList(artist, title))

кажется, это действительно замедляет ход событий.

public class BatchDownloaderService extends IntentService implements Response.Listener<String>, Response.ErrorListener {
    private int total = 0;
    private int count = 0;
    private int successCount = 0;
    private RequestQueue requestQueue;
    private OkHttpClient client = null;

    public BatchDownloaderService() {
        super("Batch Downloader Service");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        onHandleIntent(intent);
        return START_NOT_STICKY;
    }

    @Override
    protected void onHandleIntent(Intent intent) {
    if (client == null)
        getClient();
    Uri content = intent.getExtras().getParcelable("uri");
    List<List> savedLyrics = DatabaseHelper.getInstance(this).listMetadata();
    Cursor cursor = /* Get My Cursor */;
    if (cursor == null)
        return;
    total = cursor.getCount();
    updateProgress();
    final Cache cache = new DiskBasedCache(getCacheDir(), 1024*1024);
    final Network network = new BasicNetwork(new OkHttp3Stack(client));
    requestQueue = new RequestQueue(cache, network, 8);
    requestQueue.start();
    while (cursor.moveToNext()) {
        String artist = cursor.getString(0);
        String title = cursor.getString(1);
        if (artist == null || title == null || artist.isEmpty() || title.isEmpty() || savedLyrics.contains(Arrays.asList(artist, title))) {
            // If the local database already contains this item (or if null), skip the request
            updateProgress();
            continue;
        }
        try {
            Request request = QuickLyricAPI.getVolleyRequest(lrc, this, this, artist, title);
            requestQueue.add(request);
        } catch (Exception e) {
            // Stuff
        }
    }
    cursor.close();
    }

    private void updateProgress() {
        /* Update the progressbar in the notification */
    }

    @Override
    public void onErrorResponse(VolleyError error) {
        updateProgress();
        error.printStackTrace();
    }

    @Override
    public void onResponse(String response) {
    /* Stuff */
    updateProgress();
    }

    private void getClient() {
        /* Stuff */
    }
}

Если я закомментирую вызов.contains(), то не вижу никакой разницы с пустым списком и все гладко.

Я попытался заменить список TreeSet() на компаратор, он не стал быстрее. Я пытался использовать массивы String вместо списков, но это не помогло. Я также попытался использовать Countdownlatch, чтобы onHandleIntent() не заканчивал работу до того, как были выполнены все запросы. Не сработало

  1. Как IntentService может замедлить работу всего устройства и даже вызвать сбой моего SystemUI, как это? Я думал, что это работает в своем собственном потоке.
  2. Как проверка списка (в данном случае 2500 наименований) может быть такой дорогой?

Тестирование этого на Nextbit Robin с 7.0

ура

0 ответов

Другие вопросы по тегам