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() не заканчивал работу до того, как были выполнены все запросы. Не сработало
- Как IntentService может замедлить работу всего устройства и даже вызвать сбой моего SystemUI, как это? Я думал, что это работает в своем собственном потоке.
- Как проверка списка (в данном случае 2500 наименований) может быть такой дорогой?
Тестирование этого на Nextbit Robin с 7.0
ура