我正在设计一个应用程序,我需要不时下载多个图像。但是,我希望每当我发送下载请求时,它都应该排队到单个线程而不是产生多个线程。
如果您能为我提供详细的解决方案,我将不胜感激。谢谢 !
我正在设计一个应用程序,我需要不时下载多个图像。但是,我希望每当我发送下载请求时,它都应该排队到单个线程而不是产生多个线程。
如果您能为我提供详细的解决方案,我将不胜感激。谢谢 !
我会看看Executors.newFixedThreadPool()
方法。它创建了一个线程池,它一次只运行尽可能多的线程,就像你在函数中传递的一样大。如果您通过 1,它将一次只运行一个线程,因此您的下载将按顺序进行,但在“一个”不同的线程上。
在你ExecutorService
用这个方法创建你之后,你只需要在它的方法中传递一个Runnable
/ ,它就会执行它。完成后不要忘记。Callable
submit()
shutdown()
您可以创建自己的队列并将所有图像请求放在那里。使用 android AsynkTask,但只有在上一个任务完成后才开始新任务(棘手的方式)。
或者创建一个执行器服务来顺序下载图像(很难,重新发明轮子)。
或者在 github 上找到任何适用于 Android 的 ImageDownloader。有几个支持单线程下载。这个很受欢迎。(简单的方法)
PS 你可以让 android AsyncTask 顺序执行,但它在 API 11+ 中受支持。
如果您在活动中进行设计,您可以使用 AsyncTask,它使用执行程序处理线程并为您管理它们。如果您正在使用一项服务,只需在单个线程中逐个下载文件,请在一段时间不活动或出现错误数后中断并重新启动线程。
Metova Android SDK有一个名为ThreadPoolWorker
. 它的工作方式与 完全相同AsyncTask
,但有一个将ThreadPool
对象作为参数的构造函数,可以限制为一个线程。该ThreadPool
对象可以在各种ThreadPoolWorker
对象之间重用,并且每个TheadPoolWorker
的doInBackground
方法将基本上按照它们启动的顺序执行。
这是一个简单的例子:
private static final ThreadPool THREAD_POOL = new ThreadPool(1);
private void executeSomeWorkers() {
new MyThreadPoolWorker().execute("Jimmy");
new MyThreadPoolWorker().execute("Bobby");
new MyThreadPoolWorker().execute("Ronny");
}
private class MyThreadPoolWorker extends ThreadPoolWorker<String, Void, Object> {
public MyThreadPoolWorker() {
super(THREAD_POOL);
}
@Override
protected Object doInBackground(String... params) {
// Fun background stuff goes here!
}
}