初始化Gson对象的最佳方法

时间:2015-05-06 13:09:52

标签: java android performance gson

出于以下两个选项,您更喜欢哪一个初始化Gson对象?有人可以帮我理解两种方式对Android应用程序性能的影响(启动时间吗?),如果有的话。

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

VS

// 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);
}

6 个答案:

答案 0 :(得分:7)

由您决定,private static final处理此问题并没有错。您可以在此related question了解更多相关信息。

private static final Gson gson = new Gson();

答案 1 :(得分:0)

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

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

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

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

  3. 让我知道哪种方式最适合你!!

    快乐的编码!!

答案 2 :(得分:0)

如果你的gson对象不是静态的,那么你不必检查gson是否为null。如果你确定经常使用gson,那么内联选项会更好(没有空检查)。如果gson使用太稀疏,第二个选项可能更好。很多“如果”:)

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

答案 3 :(得分:0)

检查一下。

public static Gson gson;

public Constructor() {

}

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

    return gson;
}

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

答案 4 :(得分:0)

我个人认为它是Dagger2 Singleton模块:

@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();
}

但从技术上讲,就像在某个地方拥有一个单独的单个对象一样。

答案 5 :(得分:0)

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

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

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

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