我正在尝试处理多个文件写入命令(分隔文件)而不会挂起UI。
要将我的问题置于上下文中,请想象以下
我的主应用程序看起来像文件管理器。它目前看到10个文件,每个文件大小约为5MB。 (不要担心这个列表如何工作等。)
当我选择一个文件项时,我希望它立即开始将文件复制/复制到SD卡上的另一个位置。通常这需要几秒钟
我希望能够在第一个文件之后立即选择第二个或第三个等文件。在所有内容的最后,我选择的所有文件都将被复制。所以我可以,例如在5秒内点击5个文件,但所有复制操作都需要一分钟。
此刻我想到了两个选择:
首先是简单地将每个文件的文件写入命令放在一个单独的线程中。伪代码看起来像这样
Onclick
new Thread()
write file
如果这样可行,可能会出现我同时运行10个线程,写入10个单独文件的情况。我想知道是否有人之前做过这件事,以及我应该注意什么
第二种选择当然是,如果已经有某种数据结构/已知方法可以解决这个问题。某种待处理的队列系统随着我添加请求而变大,但随着系统将数据写入而变小。
答案 0 :(得分:1)
我并不完全确定SD卡是如何工作的,但我可以告诉你,尝试并行写入单个硬盘是一个坏主意,因为与顺序写入相比,它实际上会降低性能。
您可能想尝试使用ExecutorService
并使用不同的线程计数来衡量性能,但我担心您最终必须使用单个线程实现队列,并获取排队的文件并将其写入一个之一。
答案 1 :(得分:0)
我会创建一个简单地复制给定文件的AsyncTask类。每次选择文件时,都会为所选文件创建该类的新实例。 Android for AsyncTask内置的线程管理很平衡,应该很好地处理这个用例。使用内置的AsyncTask方法可以很容易地为进度和完成提供反馈。
答案 2 :(得分:0)
我认为java.util.concurrent中的类是你需要的;特别是要创建Executors的ThreadPoolEecutor类。它的好处是可以接受与用户单击一样多的任务,但将线程数限制为您指定的某个限制。 (产生没有限制的线程可能是个问题,不仅会减慢彼此的速度,还会降低UI的速度。)