2016-02-15 200 views
0

我想從共享首選項獲取值,它返回null。共享首選項值由asynctask設置。我在asynctask裏面測試了它,在烘烤面板中打印stord值,它工作正常,但是問題是當我嘗試通過單擊buttonRegister來嘗試檢索asynctask之外的值時,它顯示爲null。 logcat中沒有顯示錯誤。從asynctask檢索共享首選項值

活動的代碼:

package com.example.mohalogin; 
 

 
import java.io.UnsupportedEncodingException; 
 
import java.util.HashMap; 
 
import java.util.Properties; 
 

 
import android.app.Activity; 
 
import android.app.ProgressDialog; 
 
import android.content.Context; 
 
import android.content.Intent; 
 
import android.content.SharedPreferences; 
 
import android.os.AsyncTask; 
 
import android.os.Bundle; 
 
import android.view.View; 
 
import android.widget.Button; 
 
import android.widget.EditText; 
 
import android.widget.Toast; 
 

 
public class RegisterActivity extends Activity { 
 
\t 
 
\t private EditText editTextName; 
 
    private EditText editTextUsername; 
 
    private EditText editTextPassword; 
 
    private EditText editTextEmail; 
 

 
    private Button buttonRegister; 
 
    private Button buttonLogin; 
 
    //private Button gmail,yahoo; 
 
    Context context; 
 
    
 
    private SharedPreferences sharedpreferences; 
 
\t public static final String MyPREFERENCES = "MyPreferences" ; 
 
\t public static final String RegisResult = "result"; 
 
    
 
    
 
    private static final String REGISTER_URL = "xxxxxxxxxx"; //fake data 
 

 
\t @Override 
 
\t protected void onCreate(Bundle savedInstanceState) { 
 
\t \t super.onCreate(savedInstanceState); 
 
\t \t setContentView(R.layout.activity_register); 
 
\t \t 
 
\t \t editTextName = (EditText) findViewById(R.id.editTextName); 
 
     editTextUsername = (EditText) findViewById(R.id.editTextUserName); 
 
     editTextPassword = (EditText) findViewById(R.id.editTextPassword); 
 
     editTextEmail = (EditText) findViewById(R.id.editTextEmail); 
 

 
     buttonRegister = (Button) findViewById(R.id.buttonRegister); 
 
     buttonLogin = (Button) findViewById(R.id.buttonLogin); 
 
     
 
     
 
     buttonRegister.setOnClickListener(new View.OnClickListener(){ 
 
      @Override 
 
      public void onClick(View arg0){ 
 
      \t registerUser(); 
 
      \t 
 
      \t sharedpreferences=getApplicationContext().getSharedPreferences("MyPrefs", getApplicationContext().MODE_PRIVATE); 
 
      \t 
 
      \t buttonLogin.setText(sharedpreferences.getString("result","")); //testing by printing the value in the button 
 
      \t 
 
      } 
 
     }); 
 
     
 

 
     /*buttonLogin.setOnClickListener(new View.OnClickListener(){ 
 
      @Override 
 
      public void onClick(View arg0){ 
 
      \t 
 
      \t startActivity(new Intent(RegisterActivity.this, LoginActivity.class)); 
 
       
 
      } 
 
     });*/ 
 
\t } 
 
\t 
 
     private void registerUser() { 
 
\t \t 
 
\t \t String name = editTextName.getText().toString().trim().toLowerCase(); 
 
     String username = editTextUsername.getText().toString().trim().toLowerCase(); 
 
     String password = editTextPassword.getText().toString().trim().toLowerCase(); 
 
     String email = editTextEmail.getText().toString().trim().toLowerCase(); 
 

 
     register(name,username,password,email); \t 
 
\t } 
 
\t 
 
\t private void register(String name, String username, String password, String email) { 
 
     class RegisterUser extends AsyncTask<String, Void, String> { 
 
     \t 
 
     \t ProgressDialog loading; 
 
      RegisterUserClass ruc = new RegisterUserClass(); 
 
      private Context context2; 
 
      
 
      @Override 
 
      protected void onPreExecute() { 
 
       super.onPreExecute(); 
 
       loading = ProgressDialog.show(RegisterActivity.this, "Please Wait","Registering new user", true, false); 
 
      } 
 

 
\t \t \t @Override 
 
\t \t \t protected String doInBackground(String... params) { 
 
\t \t \t \t 
 
\t \t \t \t HashMap<String, String> data = new HashMap<String,String>(); 
 
       data.put("name",params[0]); 
 
       data.put("username",params[1]); 
 
       data.put("password",params[2]); 
 
       data.put("email",params[3]); 
 

 
       String result = ruc.sendPostRequest(REGISTER_URL,data); 
 
\t \t \t \t 
 
       return result; 
 
\t \t \t \t 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t @Override 
 
      protected void onPostExecute(String s) { 
 
       super.onPostExecute(s); 
 
       loading.dismiss(); 
 
       
 
       sharedpreferences = context2.getSharedPreferences(MyPREFERENCES, context2.MODE_PRIVATE); 
 
       SharedPreferences.Editor editor = sharedpreferences.edit(); 
 
       editor.putString(RegisResult, s); 
 
\t \t \t \t editor.commit(); 
 

 
       Toast.makeText(getApplicationContext(),sharedpreferences.getString("result",""), Toast.LENGTH_LONG).show(); 
 
       
 
      } \t 
 
\t \t \t 
 
\t \t \t public RegisterUser(Context context2) 
 
\t \t \t { 
 
\t \t \t \t this.context2=context2; 
 
\t \t \t } 
 
     } 
 

 
     RegisterUser ru = new RegisterUser(getApplicationContext()); 
 
     ru.execute(name, username, password, email); 
 

 
} 
 
}

回答

1

你的問題是與調用getSharedPreferences(字符串,整數) -

你基本上使用兩個單獨的SharePreference情況下,因爲你是傳遞一個不同名稱(字符串)的SharedPreferences每次 -

當你存儲的值,則使用 getSharedPreferences("MyPreferences", context2.MODE_PRIVATE);

當您嘗試獲取該值時,您正在使用 getSharedPreferences("MyPrefs", getApplicationContext().MODE_PRIVATE);

修改代碼以使用相同的SharedPreference名稱,它應該可以工作。

+0

謝謝您,先生,它的工作:D – akshay270494

+0

很高興我可以幫助! – guychu

0

你在錯誤的地方訪問值。 試試這個代碼,而不是:)

package com.example.mohalogin; 

    import java.io.UnsupportedEncodingException; 
    import java.util.HashMap; 
    import java.util.Properties; 

    import android.app.Activity; 
    import android.app.ProgressDialog; 
    import android.content.Context; 
    import android.content.Intent; 
    import android.content.SharedPreferences; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.Toast; 

    public class RegisterActivity extends Activity { 

     private EditText editTextName; 
     private EditText editTextUsername; 
     private EditText editTextPassword; 
     private EditText editTextEmail; 

     private Button buttonRegister; 
     private Button buttonLogin; 
     //private Button gmail,yahoo; 
     Context context; 

     private SharedPreferences sharedpreferences; 
     public static final String MyPREFERENCES = "MyPreferences" ; 
     public static final String RegisResult = "result"; 


     private static final String REGISTER_URL = "xxxxxxxxxx"; //fake data 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_register); 
      sharedpreferences=getApplicationContext().getSharedPreferences("MyPrefs", getApplicationContext().MODE_PRIVATE); 
      editTextName = (EditText) findViewById(R.id.editTextName); 
      editTextUsername = (EditText) findViewById(R.id.editTextUserName); 
      editTextPassword = (EditText) findViewById(R.id.editTextPassword); 
      editTextEmail = (EditText) findViewById(R.id.editTextEmail); 

      buttonRegister = (Button) findViewById(R.id.buttonRegister); 
      buttonLogin = (Button) findViewById(R.id.buttonLogin); 


      buttonRegister.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View arg0){ 
        registerUser(); 





       } 
      }); 


      /*buttonLogin.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View arg0){ 

        startActivity(new Intent(RegisterActivity.this, LoginActivity.class)); 

       } 
      });*/ 
     } 

      private void registerUser() { 

      String name = editTextName.getText().toString().trim().toLowerCase(); 
      String username = editTextUsername.getText().toString().trim().toLowerCase(); 
      String password = editTextPassword.getText().toString().trim().toLowerCase(); 
      String email = editTextEmail.getText().toString().trim().toLowerCase(); 

      register(name,username,password,email); 
     } 

     private void register(String name, String username, String password, String email) { 
      class RegisterUser extends AsyncTask<String, Void, String> { 

       ProgressDialog loading; 
       RegisterUserClass ruc = new RegisterUserClass(); 
       private Context context2; 

       @Override 
       protected void onPreExecute() { 
        super.onPreExecute(); 
        loading = ProgressDialog.show(RegisterActivity.this, "Please Wait","Registering new user", true, false); 
       } 

       @Override 
       protected String doInBackground(String... params) { 

        HashMap<String, String> data = new HashMap<String,String>(); 
        data.put("name",params[0]); 
        data.put("username",params[1]); 
        data.put("password",params[2]); 
        data.put("email",params[3]); 

        String result = ruc.sendPostRequest(REGISTER_URL,data); 

        return result; 

       } 

       @Override 
       protected void onPostExecute(String s) { 
        super.onPostExecute(); 
        loading.dismiss(); 

        sharedpreferences = context2.getSharedPreferences(MyPREFERENCES, context2.MODE_PRIVATE); 
        SharedPreferences.Editor editor = sharedpreferences.edit(); 
        editor.putString(RegisResult, s); 
        editor.commit(); 

        Toast.makeText(getApplicationContext(),sharedpreferences.getString("result",""), Toast.LENGTH_LONG).show(); 
        buttonLogin.setText(sharedpreferences.getString(RegisResult,"")); //testing by printing the value in the button 
       } 

       public RegisterUser(Context context2) 
       { 
        this.context2=context2; 
       } 
      } 

      RegisterUser ru = new RegisterUser(getApplicationContext()); 
      ru.execute(name, username, password, email); 

    } 
    } 
0

當您嘗試檢索asynctask外的值時,顯示爲空,因爲的AsyncTask沒做完。無論你在執行asyncTask時得到的數據如何,都需要在onPostExecute之內完成,它是唯一可以確保asyncTask已經完成的地方。

1

當您分配要由AsyncTask執行的部分代碼時,它實際上是在除Ui線程以外的新線程中執行的。實際上在的onClick的ButtonRegister,所述registerUser()以下兩行,在並行模式不是按順序運行。

如果您想確保SharedPreferences中的保存已成功完成,您可以再次閱讀並設置按鈕文本。改變OnPostExecute您的AsyncTask的是這樣的:

@Override 
protected void onPostExecute(String s) 
{ 
    super.onPostExecute(s); 
    loading.dismiss(); 
    . 
    . 
    . 


    buttonLogin.setText(sharedpreferences.getString("result","")); 
} 
+0

謝謝你,先生,我真的幫了很多。 – akshay270494

+0

很高興能幫到您 –

0

提交後重新實例化您的共享首選項。