2014-10-09 88 views
-1

我試圖在我的onPostExecute方法中設置SharedPrefences,但在我的錯誤日誌中獲得NullPointerException。我試過把它放到doInBackground()但是阻止我的結果被返回。因此,這是代碼設置SharedPreferences時獲取NullPointerException

我的任務類

public class LoginTask extends AsyncTask<Void, Void, String> { 

    private final String mEmail; 
    private final String mPassword; 

    private SharedPreferences sharedpreferences; 
    private final String MyPREFERENCES = "session" ; 

    String url = **** 

    LoginTask(String email, String password) { 
     mEmail = email; 
     mPassword = password; 
    } 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB) 
    @Override 
    public String doInBackground(Void... params) { 
     // TODO: attempt authentication against a network service. 

     try { 
      // Simulate network access. 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      return "false"; 
     } 

     ArrayList<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("email", mEmail)); 
     nameValuePairs.add(new BasicNameValuePair("password", mPassword)); 

     //Prepare the Post query 

     try { 
      HttpClient clientHttp = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(url); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = clientHttp.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      InputStream is = entity.getContent(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
      StringBuilder sb = new StringBuilder(); 
      String line = reader.readLine(); 
      sb.append(line + "\n"); 
      is.close(); 

      String result = sb.toString(); 

      System.out.println(result); 


      return result; 



     }catch (Exception e){ 

      return null; 
     } 

    } 

    @Override 
    protected void onPostExecute(final String res) { 
     try { 
      jObj = new JSONObject(res); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     try { 
      if (jObj.getString("code").equals("1")) { 

       SharedPreferences.Editor e = sharedpreferences.edit(); 
       e.putString(MyPREFERENCES,"active"); 
       e.commit(); 

       Intent myIntent = new Intent(getActivity(), HomesActivity.class); 

       //Lançer l'activité 
       startActivityForResult(myIntent, 0); 

      } else { 
       //password.setError(getString(R.string.error_incorrect_password)); 
       //password.requestFocus(); 
       AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
       builder.setTitle("Error !"); 
       builder.setMessage("The information entered is incorrect.\nPlease try again!") 
         .setCancelable(false) 
         .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           dialog.cancel(); 
          } 
         }); 
       AlertDialog alert = builder.create(); 
       alert.show(); 

      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    protected void onCancelled() { 
     LoginTask = null; 
     //showProgress(false); 
    } 
} 

我的錯誤日誌:

10-09 12:58:50.088 2878-2878/com.example.user.unchained E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.example.user.unchained, PID: 2878 
java.lang.NullPointerException 
     at com.example.user.unchained.EmailLoginActivity$LoginTask.onPostExecute(EmailLoginActivity.java:328) 
     at com.example.user.unchained.EmailLoginActivity$LoginTask.onPostExecute(EmailLoginActivity.java:255) 
     at android.os.AsyncTask.finish(AsyncTask.java:632) 
     at android.os.AsyncTask.access$600(AsyncTask.java:177) 
     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5017) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
     at dalvik.system.NativeStart.main(Native Method) 
+0

你應該使用調試器。可能的候選者是'jObj.getString(「code」)。equals(「1」)',因爲您可能會在'null''字符串上調用'equals'。 – Mena 2014-10-09 13:19:22

+0

你需要發佈你調用onPostExecute的代碼,而不僅僅是onPostExecute方法......我覺得在onPostExecute中的變量res將它作爲null傳遞給它。 – StackFlowed 2014-10-09 13:20:34

+0

@wrongAnswer我認爲'onPostExecute'方法很好,只要'res!= null'。所有的堆棧跟蹤都從這裏開始。 – Mena 2014-10-09 13:21:35

回答

1

sharedpreferencesnull。在這裏你將它聲明

private SharedPreferences sharedpreferences; 

,但你想在這裏

SharedPreferences.Editor e = sharedpreferences.edit(); 

使用它在該行之前從未初始化(給它的值),你需要像

sharedpreferences = getSharedPreferences("myPref", 0); 

但爲此,您將需要一個Context。所以,如果這是一個單獨的類,那麼您需要將ActivityContext傳遞給AsyncTask構造函數。

所以,你將需要像Context mContext;類變量,然後改變你的構造函數

LoginTask(String email, String password, Context c) { 
    mEmail = email; 
    mPassword = password; 
    mContext = c; 
} 

然後調用此任務時,傳遞活動場景與thisActivityName.this,或者電子郵件地址和密碼一起取決於被調用的方式/位置。

現在,當你初始化SharedPreference對象將是

sharedpreferences = mContext.getSharedPreferences("myPref", 0); 
+0

它對我來說是第一部分解決方案,但爲什麼需要更新解決方案呢? – Karimx 2014-10-09 13:34:02

+0

我添加了更多信息,以防它不是您的「活動」的內部類。如果它是一個單獨的類,那麼你需要通過構造函數傳遞'Context'。 – codeMagic 2014-10-09 13:39:55

+0

好的,謝謝,這是一個內部類。 PS:你能否投票決定離開倒票再次感謝! – Karimx 2014-10-09 13:41:12

1

喜在你的代碼,我無法找到sharedpreferences對象的初始化。

sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); 

sharedpreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

那麼您將無法獲得空指針異常。

1

當您調用edit()時,您的sharedpreferences可能是null

在您發佈的代碼中沒有初始化的跡象。

1

你必須在這裏初始化sharedpreference sharedpreference爲null。使用SharedPreferences sharedpreferences = getSharedPreferences(PREFERENCE_NAME,Context.MODE_PRIVATE);

1

sharedpreferences永遠不會初始化。

也許這樣的事情:

LoginTask(Context context, String email, String password) { 
    mEmail = email; 
    mPassword = password; 
    sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); 
} 
相關問題