Android:广播到ImageView下载完成

时间:2014-05-14 11:24:32

标签: android listview android-asynctask broadcastreceiver

手续

您好...

先决条件

我正在使用服务来收听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。

我希望你们能为我提供一个问题的答案。

3 个答案:

答案 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的问题。