У меня есть ArrayList строк, который содержит до 100 000 строк и хочет сделать HTTP-запрос для получения данных для каждой строки, а затем создать и вставить его в базу данных. Я делаю это со следующим кодом прямо сейчас, но он занимает слишком много времени, и я не уверен, что задачи выполняются асинхронно. Есть ли способ сделать это быстрее?Выполнение AsyncTask на Arraylist в Android для обновления базы данных
ArrayList<String> objects = new ArrayList<String>();
AsyncTask<List<String>, Void, Thread> downloadBookTask = new AsyncTask<List<String>, Void, Thread>() {
@Override
protected Thread doInBackground(List<String>... params) {
for (String object : params[0]) {
HttpURLConnection conn = null;
try {
conn = NetworkManager.getHttpURLConnection(new URL(object));
conn.setConnectTimeout(10000);
conn.connect();
ByteArrayOutputStream bais = new ByteArrayOutputStream();
InputStream is = null;
try {
is = conn.getInputStream();
// Read 4K at a time
byte[] byteChunk = new byte[4096];
int n;
while ((n = is.read(byteChunk)) > 0) {
bais.write(byteChunk, 0, n);
}
} catch (IOException e) {
//e.printStackTrace();
} finally {
if (is != null) {
is.close();
}
conn.disconnect();
}
saveDownloadedData(object, bais.toByteArray());
} catch (IOException e) {
e.printStackTrace();
} }
return null;
}
};
downloadBookTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, objects);
}
public void saveDownloadedData(String object, byte[] data) {
Book currentBook = new Book(object, data);
addBookToDatabase(currentBook);
}
Исправьте меня, если я ошибаюсь, но похоже, что вы выполняете одну асинтезу для списка строк? Разве вы не хотите запускать асинтез для каждой строки в списке? – user1282637
У меня был цикл for, повторяющийся через arraylist и внутри цикла for. Я создал асинтез для текущей строки, но он был еще медленнее, чем сейчас. – user2687482
использовать Executors для очень длинных задач, например ExecutorService newFixedThreadPool (int nThreads) вы пропускаете int 3, для 3 потоков и выполняете 3 задачи одновременно, когда одна задача завершена, отправляет другую задачу исполнителю, после того как все ваши задачи отправляются исполнителю, запустите executor.shutdown, это сделает исполнитель не принимая новые задачи, но завершит выполнение текущих. –