我有一个字符串 ArrayList,其中最多包含 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);
}
最佳答案
它很慢,因为您的downloadBookTask
执行100,000
http连接同步
。
要改进此代码,您可以尝试以下方式:每 1000 个字符串意味着 1000 个 http 连接,您可以创建一个 AsyncTask
来异步运行它。所以您将有 100 个AsyncTask
运行并发,它会比你的方式快100倍。
AsyncTask
的数量取决于您的设备硬件 RAM 和 CPU,您可以增加或减少它以适合您的情况。
注意:将 ArrayList
与 MultiThreading
一起使用时要小心,它不是线程安全
。
关于java - 在Android中的Arraylist上执行AsyncTask来更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28205500/