Android - 在AsyncTask onPostExecute()中设置的共享首选项并不总是设置?

Gen*_*nik 4 android

我有一些代码在98%的时间内工作,100%在我自己的测试中,所以除了让用户设备遇到这个问题之外,我无法真正重现问题.

我在onPostExecute()中做的是设置一个这样的参数:

   SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( AddProblemActivity.this);
            prefs.edit().putString("recent_problem_id", result ).commit();
Run Code Online (Sandbox Code Playgroud)

然后转到下一个活动:

            Intent myIntent = new Intent(AddProblemActivity.this, ProblemActivity.class);
            AddProblemActivity.this.startActivity(myIntent);
Run Code Online (Sandbox Code Playgroud)

然后尝试像这样获取该参数:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( 
              ProblemActivity.this);         

    // display a loading message before problem loads.
    String recent_problem_id = prefs.getString( "recent_problem_id" , null );

    if ( recent_problem_id == null )
    {
        // Sometimes it is null!            
    }
Run Code Online (Sandbox Code Playgroud)

谁会知道为什么会这样?

谢谢!

den*_*rew 5

如果您尝试将数据传递给新活动,为什么不在意图中将其作为字符串额外添加?然后,从新活动的intent中获取String.如果你仍然需要存储它,你可以在新活动的onCreate()从意图中拉出它之后这样做.

Intent myIntent = new Intent(AddProblemActivity.this, ProblemActivity.class);
//Add results here
myIntent.putExtra("RecentProblemId", result);
AddProblemActivity.this.startActivity(myIntent);
Run Code Online (Sandbox Code Playgroud)

然后,在新活动的onCreate中,执行以下操作:

String recentProblemId = getIntent().getStringExtra("RecentProblemId");
Run Code Online (Sandbox Code Playgroud)

现在,如果您仍然需要存储此信息,请执行以下操作:

if(recentProblemId != null){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( 
              ProblemActivity.this);         
    prefs.putString("recent_problem_id",recentProblemId).commit();
}
Run Code Online (Sandbox Code Playgroud)

我知道这并没有完全回答你的问题,为什么String并不总是被提交到onPostExecute()中的首选项.但是,在活动之间传递信息的最佳做法是通过Intents和extras.

我猜测为什么它可能并不总是适用于某些用户,他们的设备在新的Activity启动之前没有完成将数据写入共享首选项文件并尝试从同一个文件中读取.希望这可以帮助.