【问题标题】:Use AsyncTask or Thread for frequent read/write operations - Android使用 AsyncTask 或 Thread 进行频繁的读/写操作 - Android
【发布时间】:2015-07-08 05:42:34
【问题描述】:

我构建了一个 Android 应用,允许用户为我正在制作的游戏创建新关卡。关卡制作器应用程序允许用户保存新关卡并预览他们保存的所有关卡。当用户保存一个级别时,我的应用程序会生成一个代表该级别的JSONObject,然后将JSONObject.soString() 值写入本地文件(共享首选项文件或普通的旧 .txt 文件 - 我不知道哪个更好)。当用户想要预览现有关卡时,应用程序会从我的关卡文件中读取所有 JSON 字符串,将每个 JSON 转换为位图(JSON -> ViewGroup -> 位图),然后在 ListView 中显示所有位图。

现在我使用 2 个AsyncTasks:一个用于写作,一个用于阅读。不过,我不知道我是否可能每分钟产生 5-10 个新线程(每次用户保存一个新级别时一个),而且我不知道这对系统而言是否是一件坏事资源去。

这是我的问题:因为我可能需要每分钟写入我的关卡文件 5-10 次,所以每次用户保存新关卡时最好开始一个新的AsyncTask,还是我应该只创建一个背景每次用户保存或预览关卡时线程并在其上执行Runnables

【问题讨论】:

    标签: android json file-io android-asynctask


    【解决方案1】:

    AsyncTask 在内部由共享(静态)ThreadPoolExecutorLinkedBlockingQueue 控制。有诸如核心池大小和最大池大小之类的参数。从 Android 1.6 开始,核心池大小为 5,最大池大小为 128。队列大小为 10 个任务。

    因此,最大并行 AsyncTask 数量为 5,其他将排队。如果您的保存操作相对较慢,您可能会遇到 AsyncTask 被操作系统杀死并且没有保存的情况。如果您需要长时间运行的保存操作,最好使用服务。

    对我来说,我更喜欢将后台服务与我自己的 ThreadPoolExecutor 一起使用 - 这给了我一些额外的控制权,比如取消任务。如果您不想编写额外的代码,您可以使用IntentService - 它还使用 Executor 并自行对您的任务进行排队。

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      相关资源
      最近更新 更多