8

我对 Volley 有点不确定的是 RequestQueue、ImageLoader 对象和 ImageLoader.ImageCache 实现。

在我遇到的示例中,它们在 onCreate() 中被实例化,但为每个活动创建一个新的请求队列似乎没有意义。我也有大量的活动和服务,我将在任何地方使用它。如果我真的必须在每个服务或活动中实例化它们,它们有多贵?

生产应用程序用于实例化和访问这些对象的最佳实践是什么?

4

1 回答 1

10

我使用 Volley 的经验是,我会在 Application 类中启动一个 RequestQueue,将全局上下文传递给应用程序。我看不出这样做的不利之处,只是对 RequestQueue 进行静态引用,如下所示:

public class MyApplication extends Application
{
    private static RequestQueue mRequestQueue;

    @Override
    public void onCreate() {
        super.onCreate();
        mRequestQueue = Volley.newRequestQueue(getApplicationContext());
    }

    // Getter for RequestQueue or just make it public
}

在文档中,您可以为它引用的 Application 类:

在应用程序启动时调用,在创建任何活动、服务或接收器对象(不包括内容提供者)之前调用。实现应该尽可能快(例如使用状态的延迟初始化),因为在此函数中花费的时间直接影响启动进程中的第一个活动、服务或接收器的性能。如果您覆盖此方法,请务必调用 super.onCreate()。

因此可以安全地假设我们的 RequestQueue 将可用于在 Service、Activity、Loader 等中调度请求。

现在就 ImageLoader 而言,我将创建一个包含一些功能的单例类,因此您只有一个 ImageCache 实例和一个 ImageLoader,例如。

public class ImageLoaderHelper
{
    private static ImageLoaderHelper mInstance = null;

    private final ImageLoader mImageLoader;
    private final ImageCache mImageCache;

    public static ImageLoaderHelper getInstance() {
        if(mInstance == null)
            mInstance = new ImageLoaderHelper();
        return mInstance;
    }

    private ImageLoaderHelper() {
        mImageCache = new MyCustomImageCache();
        mImageLoader = new ImageLoader(MyApplication.getVolleyQueue(),mImageCache);
    }

    // Now you can do what ever you want with your ImageCache and ImageLoader
}

如果你想要一个非常好的 ImageLoading 和 volley 示例,请查看这个示例项目,它非常有用。

希望这可以帮助。

于 2013-06-27T07:02:23.743 回答