-1

我正在设计一个应用程序,我需要不时下载多个图像。但是,我希望每当我发送下载请求时,它都应该排队到单个线程而不是产生多个线程。

如果您能为我提供详细的解决方案,我将不胜感激。谢谢 !

4

4 回答 4

2

我会看看Executors.newFixedThreadPool()方法。它创建了一个线程池,它一次只运行尽可能多的线程,就像你在函数中传递的一样大。如果您通过 1,它将一次只运行一个线程,因此您的下载将按顺序进行,但在“一个”不同的线程上。

在你ExecutorService用这个方法创建你之后,你只需要在它的方法中传递一个Runnable/ ,它就会执行它。完成后不要忘记。Callablesubmit()shutdown()

于 2013-01-25T06:24:47.427 回答
1

您可以创建自己的队列并将所有图像请求放在那里。使用 android AsynkTask,但只有在上一个任务完成后才开始新任务(棘手的方式)。

或者创建一个执行器服务来顺序下载图像(很难,重新发明轮子)。

或者在 github 上找到任何适用于 Android 的 ImageDownloader。有几个支持单线程下载。这个很受欢迎。(简单的方法)

PS 你可以让 android AsyncTask 顺序执行,但它在 API 11+ 中受支持。

于 2013-01-25T06:53:57.557 回答
0

如果您在活动中进行设计,您可以使用 AsyncTask,它使用执行程序处理线程并为您管理它们。如果您正在使用一项服务,只需在单个线程中逐个下载文件,请在一段时间不活动或出现错误数后中断并重新启动线程。

于 2013-01-25T06:25:24.650 回答
0

Metova Android SDK有一个名为ThreadPoolWorker. 它的工作方式与 完全相同AsyncTask,但有一个将ThreadPool对象作为参数的构造函数,可以限制为一个线程。该ThreadPool对象可以在各种ThreadPoolWorker对象之间重用,并且每个TheadPoolWorkerdoInBackground方法将基本上按照它们启动的顺序执行。

这是一个简单的例子:

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!
    }
}
于 2013-01-25T06:46:51.333 回答