【问题标题】:Best way to init Gson object初始化 Gson 对象的最佳方法
【发布时间】:2015-07-16 15:37:25
【问题描述】:

在以下两个选项中,您更喜欢哪一个来初始化 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);
}

【问题讨论】:

    标签: java android performance gson


    【解决方案1】:

    这取决于您,但 private static final 可以解决这个问题。您可以通过related question 了解更多信息。

    private static final Gson gson = new Gson();
    

    【讨论】:

      【解决方案2】:

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

      那么为此我建议你 2 个选项!

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

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

      告诉我哪个最适合你!!

      编码愉快!!

      【讨论】:

      • 不,我在问什么是“初始化 Gson 对象的最佳方式”。它可能发生在我的应用程序生命周期中,即当用户打开应用程序时,我可能不需要解析任何 Json 数据。
      • 当你有一个数据然后初始化 json 对象!从任何地方,但确保你有一个数据!
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我个人将它作为 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();
        }
        

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

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:

            检查这个。

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

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

            【讨论】:

            • 这个 gson 将被用作单个实例。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-28
            • 1970-01-01
            • 2018-03-09
            • 2011-11-24
            • 1970-01-01
            • 1970-01-01
            • 2014-02-22
            相关资源
            最近更新 更多