2014-09-22 2 views
1

AsyncTask이 서버에 사용자 이름과 암호를 게시하기 위해 AsyncTask을 호출하고 응답시 사용자 이름이 SharedPreferences (여기서 SP에서 사용자 이름을 검색 할 수 있음)을 작성하고 반환합니다. ~ may 앱의 MainActivity. 그러나 SP에서 MainActivity으로 사용자 이름을 검색하면 null입니다. 나는 어디에서 잘못 했는가?SharedPreferences AsyncTask에서 편집기에 의해 getString이 null을 반환 함

AsyncTask를 코드 :

//activity is the context passed from LoginActivity (using "this") 
protected void onPostExecute(String result) { 
    if(result!=null){ 
     try { 
      JSONTokener jsonParser = new JSONTokener(result); 
      JSONObject msg = (JSONObject) jsonParser.nextValue(); 
      String data=msg.getString("data"); 
      int code=Integer.parseInt(msg.getString("code")); 
      if(code==0){ 
       //Write to local storage 
       SharedPreferences settings = activity.getPreferences(Context.MODE_PRIVATE); 
       SharedPreferences.Editor editor = settings.edit(); 
       JSONTokener dataParser = new JSONTokener(data); 
       JSONObject dataJSON=(JSONObject) dataParser.nextValue(); 
       editor.putString("acc_username", dataJSON.getString("username")); 
       if(dataJSON.getString("token")!=null){ 
        editor.putString("acc_token", dataJSON.getString("token")); 
       } 
       editor.commit(); 
       //Log.d("TEST",activity.getPreferences(Context.MODE_PRIVATE).getString("acc_username", null));//I can get the username here -- means the post and login request and response are correct. 
       Intent intent=new Intent(activity, MainActivity.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
       activity.startActivity(intent);  
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

MainActivity 코드 :

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //read login info from device 
    SharedPreferences settings = getPreferences(MODE_PRIVATE); 
    String accUsername = settings.getString("acc_username", null); 
    Log.d("TEST","accUsername="+accUsername);//it is null! 
} 

매니페스트 권한 : getPreferences (INT 모드) :

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
+0

dataJson이 null이 아닌 corrent 값을 반환하는지 확인할 수 있습니까? – Marius

+0

네, 맞습니다. 또한, 편집자가 SharedPreferences를 작성한 직후에 즉시 얻었고 정확합니다 (Log.d 코드 참조). – mrmoment

+0

SharedPreference 이름은 어디에 있습니까? – Aniruddha

답변

4

문제는 잘못된 방법을 사용하는 것입니다. 문서를 참조하십시오 : http://developer.android.com/reference/android/app/Activity.html#getPreferences(int)

"단순히이 활동의 ​​클래스 이름을 환경 설정 이름으로 전달하여 기본 getSharedPreferences (String, int) 메소드를 호출합니다."

코드에서 LoginActivity 클래스에 저장하기 때문에 데이터를 저장하는 데 사용한 기본 설정 파일 이름이 "LoginActivity"일 수 있습니다. 그런 다음 getPreferences (int 모드)를 사용하여 MainActivity 클래스의 해당 데이터를 가져올 때 "MainAcitity"라는 환경 설정 파일에서 데이터를 가져 오려는 것을 의미합니다. 그래서, 당신은 null을 얻어야합니다.

문제를 해결하는 방법 : getPreferences (int mode) 대신 getSharedPreferences (String, int) 메소드를 사용하고 두 개의 Activity 클래스에 저장 환경 설정 파일 이름을 지정하십시오.

2

getPreference 대신 getSharedPreference 메소드를 사용하십시오.

관련 문제