9

さまざまな Android プロジェクトで、次の静的関数を使用して1900-12-31. もちろん、この関数は決定論的であるべきですが、そうではないことがわかりました。なんで?

通常、2010-10-30たとえばdate を解析して、Dateその値を保持する正しいインスタンスにします。IntentServiceしかし、いくつかの日付を同時に実行して解析している場合、この関数は上記と同じ日付を に解析することに気付き1983-01-20ましたIntentService。これはどのように起こりますか?

public static Date dateFromString(String dateStr) {
    SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
    SimpleDateFormat mDateTimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.getDefault());
    Date dateOut = null;
    try {
        if (dateStr != null) {
            if (dateStr.length() == 7) {
                if (dateStr.startsWith("--")) {
                    dateStr = "0000"+dateStr.substring(1);
                }
            }
            else if (dateStr.length() == 6) {
                if (dateStr.startsWith("-")) {
                    dateStr = "0000"+dateStr;
                }
            }
            else if (dateStr.length() == 5) {
                dateStr = "0000-"+dateStr;
            }
            else if (dateStr.matches("[0-9]{2}\\.[0-9]{2}\\.[0-9]{4}")) {
                dateStr = dateStr.substring(6, 10)+"-"+dateStr.substring(3, 5)+"-"+dateStr.substring(0, 2);
            }
            else if (dateStr.matches("[0-9]{2}\\/[0-9]{2}\\/[0-9]{4}")) {
                dateStr = dateStr.substring(6, 10)+"-"+dateStr.substring(3, 5)+"-"+dateStr.substring(0, 2);
            }
            else if (dateStr.matches("[0-9]{8}")) {
                dateStr = dateStr.substring(0, 4)+"-"+dateStr.substring(4, 6)+"-"+dateStr.substring(6, 8);
            }
            if (dateStr.length() >= 20) {
                String dateTimeStr = dateStr.trim();
                if (dateTimeStr.endsWith("Z")) {
                    dateTimeStr = dateStr.substring(0, dateTimeStr.length()-1)+"+0000";
                }
                if (dateStr.charAt(10) == ' ') {
                    dateTimeStr = dateStr.substring(0, 10)+"T"+dateStr.substring(11);
                }
                try {
                    dateOut = mDateTimeFormat.parse(dateTimeStr);
                }
                catch (Exception e2) {
                    dateOut = mDateFormat.parse(dateStr);
                }
            }
            else {
                dateOut = mDateFormat.parse(dateStr);
            }
        }
    }
    catch (Exception e) {
        dateOut = null;
    }
    return dateOut;
}

編集:私は仕事をする を開始する場所でActivity解析を行います。では、同じジョブを実行するバックグラウンド サービスが開始されます。アプリを閉じて (onStop())、すぐに再起動すると (onCreate())、両方が同時に実行されているように見え、エラーが発生します。onCreate()AsyncTaskActivityonStop()

4

1 に答える 1

7

のドキュメントはSimpleDateFormat言う:

SimpleDateFormatはスレッドセーフではありません。ユーザーは、スレッドごとに個別のインスタンスを作成する必要があります。

どうぞ。SimpleDateFormat各スレッドで個別にオブジェクトを作成し、それをメソッドに渡すだけです。

于 2013-01-14T03:35:51.120 に答える