java - 在Android中的Arraylist上执行AsyncTask来更新数据库

标签 java android arraylist android-asynctask

我有一个字符串 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,您可以增加或减少它以适合您的情况。

注意:将 ArrayListMultiThreading 一起使用时要小心,它不是线程安全

关于java - 在Android中的Arraylist上执行AsyncTask来更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28205500/

相关文章:

android - 扩展 Android 应用程序的最佳做法是什么?

java - 如何根据特定索引范围对 ArrayList<String> 进行排序

c# - C#中套接字的列表或ArrayList

java - MongoDB:IllegalStateException:Spring Boot 应用程序中的池已关闭错误消息

java - log4j 重定向到 swing 中的桌面应用程序

Java IoC 和 Guice - 依赖注入(inject)

java - 为什么这个类要参与连载

android - 如何使上下文操作栏出现在底部

android - @android资源ID

java - 使用 Collections.sort(arrayListName) 按 id 对充满对象的 ArrayList 进行排序