GVKun编程网logo

SimpleDateFormat警告:要获取本地格式,请使用getDateInstance(),getDateTimeInstance()或getTimeInstance(),

14

对于想了解SimpleDateFormat警告:要获取本地格式,请使用getDateInstance的读者,本文将是一篇不可错过的文章,我们将详细介绍,getDateTimeInstance,并且为您

对于想了解SimpleDateFormat警告:要获取本地格式,请使用getDateInstance的读者,本文将是一篇不可错过的文章,我们将详细介绍,getDateTimeInstance,并且为您提供关于Activity的onSaveInstanceState()和 onRestoreInstanceState()方法、Android onSaveInstanceState和onRestoreInstanceState触发的时机、android – 如何使用onSaveInstanceState()和onRestoreInstanceState()?、Calendar.getInstance(TimeZone.getTimeZone(“ UTC”))没有返回UTC时间的有价值信息。

本文目录一览:

SimpleDateFormat警告:要获取本地格式,请使用getDateInstance(),getDateTimeInstance()或getTimeInstance(),

SimpleDateFormat警告:要获取本地格式,请使用getDateInstance(),getDateTimeInstance()或getTimeInstance(),

我是否需要担心此警告?如果我忽略该警告怎么办?
这是什么警告表示:
为了让本地格式使用getDateInstance()getDateTimeInstance()getTimeInstance(),或使用newSimpleDateFormat(String template, Locale locale)与例如Locale.US用于ASCII日期。
在下面代码的第二行。该应用程序可以正常工作的代码。我想显示日期,例如19 Nov 2014

public static String getFormattedDate(long calendarTimeInMilliseconds) {    SimpleDateFormat sdfDate = new SimpleDateFormat("d MMM yyyy");  //ON THIS LINE    Date now = new Date();    now.setTime(calendarTimeInMilliseconds);    String strDate = sdfDate.format(now);    return strDate;}

答案1

小编典典

您当前正在使用SimpleDateFormat(String)构造函数。这暗示了默认语言环境,并且正如语言环境文档告诉您的那样,请警惕默认语言环境,因为可能在各种系统上产生意外的输出。

您应该改用SimpleDateFormat(String,Locale)构造函数。它将接受一个附加参数-
您要使用的语言环境。如果要确保输出以一致的方式是机器可读的(无论用户的实际语言环境如何,总是看起来相同),则可以选择Locale.US。如果您不关心计算机的可复制性,则可以将其显式设置为使用Locale.getDefault()。

在示例代码中使用这些代码将如下所示:

// for USSimpleDateFormat sdfDate = new SimpleDateFormat("d MMM yyyy", Locale.US);// or for defaultSimpleDateFormat sdfDate = new SimpleDateFormat("d MMM yyyy",        Locale.getDefault());

Activity的onSaveInstanceState()和 onRestoreInstanceState()方法

Activity的onSaveInstanceState()和 onRestoreInstanceState()方法

@Override
  protected void onRestoreInstanceState(Bundle savedState) {
    super.onRestoreInstanceState(savedState);
    mSeries = (CategorySeries) savedState.getSerializable("current_series");
    mRenderer = (DefaultRenderer) savedState.getSerializable("current_renderer");
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("current_series", mSeries);
    outState.putSerializable("current_renderer", mRenderer);
  }


Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,

它们不同于onCreate()、onPause()等生命周期方法,它们并不一定会被触发。

当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,

onSaveInstanceState() 会被调用(由运行状态进入暂停状态或停止状态)

但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。

因为在这种情况下,用户的行为决定了不需要保存Activity的状态。

通常onSaveInstanceState()只适合用于保存一些临时性的状态,

而onPause()适合用于数据的持久化保存。

另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,

如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。


Android onSaveInstanceState和onRestoreInstanceState触发的时机

Android onSaveInstanceState和onRestoreInstanceState触发的时机

先看Application Fundamentals上的一段话:

Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key)

从这句话可以知道,当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState就会被执行,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。

注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?通过重写一个 activity的所有生命周期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我们可以清楚地知道当某个activity(假定为activity A)显示在当前task的最上层时,其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:

1、当用户按下HOME键时。

这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

2、长按HOME键,选择运行其他的程序时。

3、按下电源按键(关闭屏幕显示)时。

4、从activity A中启动一个新的activity时。

5、屏幕方向切换时,例如从竖屏切换到横屏时。

在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行

总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则 onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。

至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和 onRestoreInstanceState方法“不一定”是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行

另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原

文章出处:http://qq361119908.iteye.com/blog/813282

android – 如何使用onSaveInstanceState()和onRestoreInstanceState()?

android – 如何使用onSaveInstanceState()和onRestoreInstanceState()?

我试图在方向更改中保存数据.如下面的代码所示,我使用onSaveInstanceState()和onRestoreInstanceState().我尝试获取保存的值,并检查它是否是onRestoreInstanceState()中的正确值.但是当我尝试在onCreate()中使用新值时,我没有新值,而是旧值.

protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("TEXT", user);

    }
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    savedUser = savedInstanceState.getString("TEXT");
    Log.d("enregistred value", savedUser);

}



public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        int display_mode = getResources().getConfiguration().orientation;

        if (display_mode == 1) {

            setContentView(R.layout.main_grid);
            mGrid = (GridView) findViewById(R.id.gridview);
            mGrid.setColumnWidth(95);
            mGrid.setVisibility(0x00000000);
            // mGrid.setsystemUIVisibility(View.SYstem_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

        } else {
            setContentView(R.layout.main_grid_land);
            mGrid = (GridView) findViewById(R.id.gridview);
            mGrid.setColumnWidth(95);
            Log.d("Mode", "land");
            // mGrid.setsystemUIVisibility(View.SYstem_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

        }
        Log.d("savedUser", savedUser);
        if (savedUser.equals("admin")) { //value 0
            adapter.setApps(appManager.getApplications());
        } else if (savedUser.equals("prof")) { //value 1
            adapter.setApps(appManager.getTeacherApplications());
        } else {// default value
            appManager = new ApplicationManager(this, getPackageManager());
            appManager.loadApplications(true);
            bindApplications();
        }
}

解决方法:

When your activity is recreated after it was prevIoUsly destroyed, you
can recover your saved state from the Bundle that the system passes
your activity. Both the onCreate() and onRestoreInstanceState()
callback methods receive the same Bundle that contains the instance
state information.

Because the onCreate() method is called whether the system is creating
a new instance of your activity or recreating a prevIoUs one, you must
check whether the state Bundle is null before you attempt to read it.
If it is null, then the system is creating a new instance of the
activity, instead of restoring a prevIoUs one that was destroyed.

static final String STATE_USER = "user";
private String mUser;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Check whether we're recreating a prevIoUsly destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mUser = savedInstanceState.getString(STATE_USER);
    } else {
        // Probably initialize members with default values for a new instance
        mUser = "NewUser";
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putString(STATE_USER, mUser);
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

Calendar.getInstance(TimeZone.getTimeZone(“ UTC”))没有返回UTC时间

Calendar.getInstance(TimeZone.getTimeZone(“ UTC”))没有返回UTC时间

我真的对Calendar.getInstance(TimeZone.getTimeZone("UTC"))方法调用的结果感到困惑,因为它返回了IST时间。

这是我使用的代码

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

我得到的答复是:

Sat Jan 25 15:44:18 IST 2014

所以我尝试将默认的TimeZone更改为UTC,然后检查了一下,然后工作正常

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

TimeZone tz  = TimeZone.getDefault() ;
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());
TimeZone.setDefault(tz);

结果:

Sat Jan 25 16:09:11 IST 2014
Sat Jan 25 10:39:11 UTC 2014

我在这里想念什么吗?

关于SimpleDateFormat警告:要获取本地格式,请使用getDateInstance,getDateTimeInstance的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Activity的onSaveInstanceState()和 onRestoreInstanceState()方法、Android onSaveInstanceState和onRestoreInstanceState触发的时机、android – 如何使用onSaveInstanceState()和onRestoreInstanceState()?、Calendar.getInstance(TimeZone.getTimeZone(“ UTC”))没有返回UTC时间等相关知识的信息别忘了在本站进行查找喔。

本文标签: