我对 Volley 有点不确定的是 RequestQueue、ImageLoader 对象和 ImageLoader.ImageCache 实现。
在我遇到的示例中,它们在 onCreate() 中被实例化,但为每个活动创建一个新的请求队列似乎没有意义。我也有大量的活动和服务,我将在任何地方使用它。如果我真的必须在每个服务或活动中实例化它们,它们有多贵?
生产应用程序用于实例化和访问这些对象的最佳实践是什么?
我对 Volley 有点不确定的是 RequestQueue、ImageLoader 对象和 ImageLoader.ImageCache 实现。
在我遇到的示例中,它们在 onCreate() 中被实例化,但为每个活动创建一个新的请求队列似乎没有意义。我也有大量的活动和服务,我将在任何地方使用它。如果我真的必须在每个服务或活动中实例化它们,它们有多贵?
生产应用程序用于实例化和访问这些对象的最佳实践是什么?
我使用 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 示例,请查看这个示例项目,它非常有用。
希望这可以帮助。