手续
您好...
先决条件
我正在使用服务来收听Wi-Fi和蓝牙适配器(在特定情况下,连续检测SSID和蓝牙信标)以及需要在后台执行的其他任务,例如下载。我在此服务中维护一个ExecutorService来执行runnables和asynctasks。
我通过广播接收器检测到Wi-Fi状态,GCM消息等的变化。
我需要能够将数据写入缓存,内部和外部存储。读过DownloadManager类只允许写入外部存储,这种方式阻止了我使用它。 (编写我自己的并使用DownloadManager似乎不太理想)。
我已经使用Volley和OkHttp测试了我的网络需求,但它们看起来比我的AsyncTask解决方案慢,尽管Volley为我提供了一个易于使用的NetworkImageView(或其名称)。我已经测试过下载26mb文件和100< 60kb文件。可能是我的实现,但AsyncTask更快。
我也必须下载音频文件,如果我将使用库加载图像,那么还是必须编写下载类。因此,我希望将用于下载文件的代码组合到一个类中。
方案
考虑到上述信息,我决定使用AsyncTask在我的listviews中延迟加载图像。我正在寻找一种将广播发送回活动并更新执行下载的ImageView的好方法。有没有人知道迭代ListView适配器中的列表项的替代解决方案?
目前我会在我的活动中注册一个broadcastreceiver并迭代我的适配器的集合,然后将图像的id与存储在集合中的模型中的id匹配。我想知道是否有办法直接调用模型/ listitem来更新图像的表示。
代码
CoreManagerService:
public class CoreManagerService extends Service {
/**
* TODO Create separate running threads using this ExecutorService.
* To be used for spawning threads that handle scanning for Bluetooth, Wi-Fi etc.
* Creates a thread pool with a dynamic number of workers.
* @see ExecutorService {@link java.util.concurrent.Executors#newCachedThreadPool()}
*/
public ExecutorService mThreadPool = Executors.newCachedThreadPool();
StartDownloadReceiver:
@Override
public void onReceive(Context context, Intent intent) {
DownloadImagesTask task = new DownloadImagesTask(context);
task.executeOnExecutor(service.mThreadPool, intent);
}
DownloadImagesTask:
public class DownloadImagesTask extends AsyncTask<Intent, Integer, FileTransferJavaBean> {
我认为你不需要这里的来源来获得一般的想法。我使用Java Bean来存储我的值并向它们发送activity-&gt; service和service-&gt; activity。我知道Intent可以为我做这一切,但为此创建一个类看起来更干净。 Java Bean实现了Parcelable。
我希望你们能为我提供一个问题的答案。
答案 0 :(得分:1)
通用图像加载器正是您所需要的。
https://github.com/nostra13/Android-Universal-Image-Loader
您还可以通过asynctask的onPostExecute方法回调您的活动,如下所示:
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
myImageView.setImageBitmap(myimage.getBitmap());
}
});
答案 1 :(得分:1)
尝试Picasso下载和缓存图片。它与开箱即用的适配器完美配合。
答案 2 :(得分:0)
任何遇到同样问题的人都应该看一下:https://www.youtube.com/watch?v=xHXn3Kg2IQE。
虽然我的问题是关于下载,这很容易通过广播来解决,但是需要你手动跟踪你的广播接收器等等。现在REST来了,我很快意识到广播不会削减它。
我仍然可以在模式C中使用我的AsyncTasks,这在视频中有描述,并为下载图像,音频等创建内容提供者。
该模式提供的优势非常显着。虽然某些优点可能与当前手机无关(自动检查其他应用是否正在同步以降低手机负载)。
我将在此处创建一个新问题,以便回答有关如何正确实现contentprovider和ORMLite的问题。