2016-08-09 29 views
1

我聽說過性能問題過去關於在Android上使用Joda Time。一個具體的例子是時區數據加載方式的一個問題,在應用程序的整個生命週期中,這些數據導致大量的內存在不再需要的時候被分配。不過,我相信這一點也解決了其中一些問題。目前Joda Android上的時間表現?

除了一般的「我不信任」情緒,:)有沒有任何當前問題,繼續使喬達時間處理Android上的日期不好的選擇?

+0

JodaTime有一個[Android port](https://github.com/dlew/joda-time-android)。不過,不知道它是否真的有必要。 –

回答

1

問題依然存在。問題是圖書館使用ClassLoader.getResourceAsStream。此問題尚未得到解決,因爲Android 6.0.1_r11 - 詳見here

在撰寫本文時,默認ZoneInfoProviderstill uses this mechanism - 從master的當前提示:

private InputStream openResource(String name) throws IOException { 
    InputStream in; 
    if (iFileDir != null) { 
     in = new FileInputStream(new File(iFileDir, name)); 
    } else { 
     final String path = iResourcePath.concat(name); 
     in = AccessController.doPrivileged(new PrivilegedAction<InputStream>() { 
      public InputStream run() { 
       if (iLoader != null) { 
        return iLoader.getResourceAsStream(path); 
       } else { 
        return ClassLoader.getSystemResourceAsStream(path); 
       } 
      } 
     }); 
     if (in == null) { 
      StringBuilder buf = new StringBuilder(40) 
       .append("Resource not found: \"") 
       .append(path) 
       .append("\" ClassLoader: ") 
       .append(iLoader != null ? iLoader.toString() : "system"); 
      throw new IOException(buf.toString()); 
     } 
    } 
    return in; 
} 

在幾跳,你可以跟蹤這個問題方法的使用回DateTimeZone.getProviderhere

public static Provider getProvider() { 
    Provider provider = cProvider.get(); 
    if (provider == null) { 
     provider = getDefaultProvider(); 
     if (!cProvider.compareAndSet(null, provider)) { 
      provider = cProvider.get(); 
     } 
    } 
    return provider; 
} 

getDefaultProvider()將產生有問題的ZoneInfoProvider類;因此,如果您使用默認時間爲Provider的JodaTime,則仍然會有相同的性能問題。