初始化 Gson 对象的最佳方式

Best way to init Gson object

在以下两个选项中,您更喜欢哪个选项来初始化 Gson 对象?有人可以帮助我了解这两种方式对 Android 应用性能(启动时间?)的影响,如果有的话。

// inline creation
private final Gson gson = new Gson();

// need base creation, overhead of sync everytime while accessing gson object
private synchronized Gson getOrCreateGson() {
    gson == null ? gson = new Gson() : gson;
    return gson.fromJson(jsonString, clazz);
}

好的,从你的问题来看,你问的是哪种方法更适合处理 json 数据!

然后为此我建议您 2 个选项!!

  1. https://github.com/loopj/android-async-http

  2. https://github.com/mcxiaoke/android-volley

让我知道哪个最适合你!!

编码愉快!!

这取决于您,但是 private static final 来处理这件事并没有错。您可以在 related question.

阅读更多相关信息
private static final Gson gson = new Gson();

如果您的 gson 对象不是静态的,那么您不必检查 gson 是否为空。如果您确定 gson 将经常使用,则内联选项更好(无空检查)。如果 gson 使用率太低,第二个选项可能更好。很多 "if" :)

另一方面,初始化gson需要多少毫秒?我认为你不需要考虑这种情况下的性能。

检查这个。

public static Gson gson;

public Constructor() {

}

public static Gson getInstance() {
    if (gson == null) {
        gson = new Gson();
    }

    return gson;
}

您只需调用getInstance()函数来获取初始化的gson对象以备使用。每次它都不会初始化新的Gson对象并重新使用旧的初始化对象。

就我个人而言,我将其作为 Dagger2 单例模块:

@Module
public class GsonModule {
    @Provides
    @Singleton
    public Gson providesGson() {
        Gson gson = new GsonBuilder()
            .setExclusionStrategies(new ExclusionStrategy() { //Realm workaround
            @Override
            public boolean shouldSkipField(FieldAttributes f) {
                return f.getDeclaringClass().equals(RealmObject.class);
            }

            @Override
            public boolean shouldSkipClass(Class<?> clazz) {
                return false;
            }
        }).create();
        return gson;
    }
}

@Module
public class ApplicationModule {
    private final CustomApplication application;

    public ApplicationModule(CustomApplication application) {
        this.application = application;
    }

    @Provides
    @Singleton
    public CustomApplication application() {
        return this.application;
    }
}

@Singleton
@Component(modules = {GsonModule.class, ApplicationModule.class})
public interface ApplicationComponent {
    void inject(MainActivity mainActivity);
    //exposed to sub-modules.
    CustomApplication application();
}

但从技术上讲,这就像在某处有一个单独的对象。

一个实例化了一个新对象,另一个是...错误的,因为它有两个 returns。

如果您的代码中没有上述问题,第一个更好,因为在第二个中您有

return gson == null ? gson = new Gson() : gson;

它有一个开销空值检查,每次你请求一个 gson 对象时都必须完成。然而,这与 Gson 无关。这对于任何其他实例化都是一样的。所以你可以使用第一个就好了,关于 Gson,考虑是使用 new Gson() 还是 GsonBuilder.create() 更好,因为它有更多的自定义。