【发布时间】:2015-03-28 03:14:18
【问题描述】:
我有一个包含多达 100,000 个字符串的字符串数组列表,并希望发出 HTTP 请求以获取每个字符串的数据,然后创建并将其插入数据库。我现在正在使用以下代码执行此操作,但是它花费的时间太长,而且我不确定这些任务是异步执行的。有什么方法可以加快速度吗?
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);
}
【问题讨论】:
-
如果我错了,请纠正我,但您似乎正在为字符串列表执行一个异步任务?您不想为列表中的每个字符串启动一个异步任务吗?
-
我曾经有一个 for 循环遍历 arraylist,在 for 循环中我为当前字符串创建了一个 asynctask,但它比现在慢
-
使用 Executors 处理很长的任务,例如 ExecutorService newFixedThreadPool (int nThreads) 你可以传递 int 3,用于 3 个线程并同时执行 3 个任务,当一个任务完成时发送另一个任务给执行者,在你所有的任务都发送给执行者之后,运行executor.shutdown,这将使执行者不接受新任务,但会完成当前的任务。
标签: java android arraylist android-asynctask