Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 下载时是绑定服务还是自定义线程?_Java_Android_Caching_Service_Multitasking - Fatal编程技术网

Java 下载时是绑定服务还是自定义线程?

Java 下载时是绑定服务还是自定义线程?,java,android,caching,service,multitasking,Java,Android,Caching,Service,Multitasking,我正在做一个Android项目,在这个项目中,我需要将一些图像加载到GridView。图像可能在缓存中,如果缓存丢失,则查询Internet服务器。我的设计是使用两个线程来完成加载任务。一个线程用于读取缓存,一个线程用于下载。所以有3个线程,包括UI线程。它们每个都有自己的消息队列,并使用处理程序进行通信 我的问题是在这种情况下是否应该使用绑定服务?事实上,我已经实现了上面的设计,看起来没有什么错,但是GC工作非常努力,这可以从logcat中推断出来 另一个问题是,当我使用DDMS监视线程时,存

我正在做一个Android项目,在这个项目中,我需要将一些图像加载到GridView。图像可能在缓存中,如果缓存丢失,则查询Internet服务器。我的设计是使用两个线程来完成加载任务。一个线程用于读取缓存,一个线程用于下载。所以有3个线程,包括UI线程。它们每个都有自己的消息队列,并使用处理程序进行通信

我的问题是在这种情况下是否应该使用绑定服务?事实上,我已经实现了上面的设计,看起来没有什么错,但是GC工作非常努力,这可以从logcat中推断出来

另一个问题是,当我使用DDMS监视线程时,存在多个线程。这是因为在多个活动中使用了相同的加载机制。我让线程在调用onPause()时退出其消息循环,我确信在同一时间只有两个线程处于活动状态。但我可以在DDMS中看到它们。(顺便说一句,为什么线程仍然存在?我让thread=null;)


总之,我的问题是:这个加载任务能从绑定服务中受益吗?

那么为什么要使用多个线程呢?您需要在后台加载图像,完成后在UI中显示。对于图像来自哪里的UI来说,这真的无关紧要。使用多个线程并不能加快速度,只会消耗更多内存。只需使用一个后台线程:首先它命中缓存,如果没有命中,则下载


当你想做一些不需要UI的事情时,服务是为你准备的。如果您需要实时更新UI,那么服务就没有多大意义

谢谢你的回复。但是一个用于缓存和下载的后台线程是不够的。这样,在以前的下载任务完成之前,不会加载缓存中的图像。在双后台线程设计中,如果图像在缓存中,则可以尽快加载图像。据我所知,“绑定服务”可用于与活动进行通信。这种通信可能是双边的,因此理论上绑定服务适用于这种情况。但我想知道的是绑定服务是否更高效。服务并不是特别的:如果你想让它运行线程,你必须创建它们。对于您的情况,您可能希望有多个(但绑定的)加载线程,以便更快地完成任务。有一些开源库可以做到这一点,IIRC在AOSP代码中有一些示例。在任何情况下,这里都不需要使用服务。这里有一个非常好的服务:。如果您查看源代码,您会发现这不是一件小事,您可能希望使用一个库,而不是尝试重新创建它。我今天试过这个图书馆。这是一个很好的实用程序,然而,不是我需要的。关于几个小问题。我的服务器将阻止一个并发查询过多的用户。因此,我需要禁用这个库提供的多线程函数,在这种情况下,这个库作为您的第一个设计成为单线程。另一个重要的问题是,这个库高度利用了AsyncTask,我用它来做其他事情。它们将由于系统线程池而相互阻塞。另外,下载任务的顺序是我无法控制的。你的建议对我很有用。我已经将ImageLoader实例移动到应用程序类中,就像他们在开源类中所做的一样。现在DDMS中没有太多线程。