NullPointerException PreferenceManager

L

Lucius1972

Neues Mitglied
0
Guten Morgen,

Ich probiere mittels den CookieManager, Cookies zu speichern und zu laden mittels eine "saveCookies" und "loadCookies" Funktion aber Ich bekomme immer eine NullPointerException in:

PreferenceManager.getDefaultSharedPreferences(context).edit().putString("cookie", new_cookie).commit();

saveCookies:

Code:
public class HttpUtility {

    static CookieManager myCookies = new CookieManager(null, CookiePolicy.ACCEPT_ALL);
.....
final public static void saveCookies(HttpURLConnection connection , Context context) {
        Map<String, List<String>> headerFields = connection.getHeaderFields();

        List<String> cookiesHeader = null;
        try {
            cookiesHeader = headerFields.get("Set-Cookie");
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (cookiesHeader != null && myCookies != null) {
            for (String cookie : cookiesHeader) {
                try {
                    cookie = cookie.replace("\"", "");
                    myCookies.getCookieStore().add(connection.getURL().toURI(), HttpCookie.parse(cookie).get(0));
                    String new_cookie = TextUtils.join(";", myCookies.getCookieStore().getCookies());

                    PreferenceManager.getDefaultSharedPreferences(context).edit().putString("cookie", new_cookie).commit();

                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
....
}
 
Zuletzt bearbeitet:
Hi,
zerleg doch mal das Statement in einzelne Teile, dann bekommst Du einen besseren Eindruck, wo genau der Fehler auftritt. Ich hätte jetzt gesagt, dass wohl 'context' null ist.

Javascript:
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
Editor e = sharedPrefs.edit();
e.putString("cookie", new_cookie);
e.commit();
 
reallord schrieb:
Hi,
zerleg doch mal das Statement in einzelne Teile, dann bekommst Du einen besseren Eindruck, wo genau der Fehler auftritt. Ich hätte jetzt gesagt, dass wohl 'context' null ist.

Javascript:
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
Editor e = sharedPrefs.edit();
e.putString("cookie", new_cookie);
e.commit();
@realllord,
Danke ertsmal fuer den reply, oje die "context" Geschichte wieder. Hast du bitte einen Tip wie Ich es besser machen kann?
 
Öhm, Du hast jetzt noch gar nicht geschrieben, ob's wirklich der context war. Meinerseits war das ja erstmal nur ne Vermutung.

Falls es der context ist:
Im Prinzip sieht das für mich so richtig aus, allerdings liegt der Fehler dann ja bereits im Aufruf von saveCookies und Du gibst ihr den context als Parameter mit. Dann ist der dort bereits null bzw. eben dort wo Du eigentlich saveCookies aufrufst. (Kann wegen static ja sonst wo sein.)
Dort müsstest Du dann eben den richtigen context aufrufen/mitgeben.

Oder Du machst sowas in deiner Main Activity:
Javascript:
public class DeineMainActivity extends Activity ... {

  public static Context myContext;

  @Override
    public void onCreate(Bundle savedInstanceState) {
        myContext = getApplicationContext();
        ...
     }

Dann kannst Du halt danach in HttpUtility DeineMainActivity.myContext verwenden.
 
reallord schrieb:
Öhm, Du hast jetzt noch gar nicht geschrieben, ob's wirklich der context war. Meinerseits war das ja erstmal nur ne Vermutung.

Falls es der context ist:
Im Prinzip sieht das für mich so richtig aus, allerdings liegt der Fehler dann ja bereits im Aufruf von saveCookies und Du gibst ihr den context als Parameter mit. Dann ist der dort bereits null bzw. eben dort wo Du eigentlich saveCookies aufrufst. (Kann wegen static ja sonst wo sein.)
Dort müsstest Du dann eben den richtigen context aufrufen/mitgeben.

Oder Du machst sowas in deiner Main Activity:
Javascript:
public class DeineMainActivity extends Activity ... {

  public static Context myContext;

  @Override
    public void onCreate(Bundle savedInstanceState) {
        myContext = getApplicationContext();
        ...
     }

Dann kannst Du halt danach in HttpUtility DeineMainActivity.myContext verwenden.
@reallord,
Danke fuer die Info aber funktioniert leider nicht, habe deine Vorschlaege gemacht aber bekomme noch immer die Exception. Meine MainActivity hat schon volgende declaration:
MainActivity extends AppCompatActivity
In der HttpUtility Class habe Ich dann folgendes gemacht:
Code:
final public void saveCookies(HttpURLConnection connection, Context context) {
...
PreferenceManager.getDefaultSharedPreferences(MainActivity.myContext).edit().putString("cookie", new_cookie).commit();
...}
Die ganze Context Geschichte faellt mir schwer.
 
Merkwürdig...aber dann kloppen wir halt erstmal hübsche Logmeldungen rein, um das Problem einzugrenzen.

Pack mal bitte folgendes vor den getDefaultSharedPreferences(...)..... Aufruf:
Javascript:
...
if(context != null){
    Log.d("HttpUtility.saveCookies", "Parameter context: Yay, geht!" );
} else {
    Log.d("HttpUtility.saveCookies", "Parameter context: Ahh, geht nicht!" );
}

if(MainActivity.myContext != null){
    Log.d("HttpUtility.saveCookies", "MainActivity.myContext: Yay, geht!" );
} else {
    Log.d("HttpUtility.saveCookies", "MainActivity.myContext: Ahh, geht nicht!" );
}

if(new_cookie != null){
    Log.d("HttpUtility.saveCookies", "new_cookie: Yay, geht!: " + new_cookie );
} else {
    Log.d("HttpUtility.saveCookies", "new_cookie: Ahh, geht nicht!" );
}
PreferenceManager.getDefaultSharedPreferences(MainActivity.myContext).edit().putString("cookie", new_cookie).commit();
...



Testest Du eigentlich auf einem echten Gerät (Smartphone/Tablet)? Oder mit einem Emulator?
Und Du hast Zugriff auf Logcat nehme ich an?
 
reallord schrieb:
Merkwürdig...aber dann kloppen wir halt erstmal hübsche Logmeldungen rein, um das Problem einzugrenzen.

Pack mal bitte folgendes vor den getDefaultSharedPreferences(...)..... Aufruf:
Javascript:
...
if(context != null){
    Log.d("HttpUtility.saveCookies", "Parameter context: Yay, geht!" );
} else {
    Log.d("HttpUtility.saveCookies", "Parameter context: Ahh, geht nicht!" );
}

if(MainActivity.myContext != null){
    Log.d("HttpUtility.saveCookies", "MainActivity.myContext: Yay, geht!" );
} else {
    Log.d("HttpUtility.saveCookies", "MainActivity.myContext: Ahh, geht nicht!" );
}

if(new_cookie != null){
    Log.d("HttpUtility.saveCookies", "new_cookie: Yay, geht!: " + new_cookie );
} else {
    Log.d("HttpUtility.saveCookies", "new_cookie: Ahh, geht nicht!" );
}
PreferenceManager.getDefaultSharedPreferences(MainActivity.myContext).edit().putString("cookie", new_cookie).commit();
...



Testest Du eigentlich auf einem echten Gerät (Smartphone/Tablet)? Oder mit einem Emulator?
Und Du hast Zugriff auf Logcat nehme ich an?
Ich teste auf mein Tablet (Nexus 9), ja habe Logcat zugriff. Ok habe mal dein Code reingekloppt, hier das Ergebnis:

Code:
D/HttpUtility.saveCookies: Parameter context: Ahh, geht nicht!
D/HttpUtility.saveCookies: MainActivity.myContext: Ahh, geht nicht!
D/HttpUtility.saveCookies: new_cookie: Yay, geht!: ASP.NET_SessionId=bfdbdf75fh
W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
W/System.err:     at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:375)
W/System.err:     at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:370)
W/System.err:     at com.example.test.HttpUtility.saveCookies(HttpUtility.java:85)
W/System.err:     at com.example.test.HttpUtility.sendGetRequest(HttpUtility.java:173)
W/System.err:     at com.example.test.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:274)
W/System.err:     at com.example.test.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:250)
W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err:     at java.lang.Thread.run(Thread.java:818)
 
Mhh, kann es sein, dass vor deiner MainActivity noch eine andere Activity kommt? Z.B. Login oder so? Und erst bei erfolgreichem Login wird der "Rest" der App aufgerufen?
 
reallord schrieb:
Mhh, kann es sein, dass vor deiner MainActivity noch eine andere Activity kommt? Z.B. Login oder so? Und erst bei erfolgreichem Login wird der "Rest" der App aufgerufen?
Hast voellig recht, Ich habe 2 activities (MainActivity und LoginActivity) wobei Ich ueber die Manifest die LoginActivity als erstes lade. Bei erfolgreichen login wird dann die MainActivity angezeigt.
 
Okaayyy. =)

Entferne doch mal bitte das
Javascript:
public static Context myContext;
und das
Javascript:
myContext = getApplicationContext();
und packe stattdessen beides an die entsprechenden Stellen im deiner LoginActivity.
 
reallord schrieb:
Okaayyy. =)

Entferne doch mal bitte das
Javascript:
public static Context myContext;
und das
Javascript:
myContext = getApplicationContext();
und packe stattdessen beides an die entsprechenden Stellen im deiner LoginActivity.
Ich habs! Ich habe
Javascript:
public static Context myContext;
und das
Javascript:
myContext = getApplicationContext();
aus der MainActivity entfernt und in der LoginActivity implementiert, dabei
PreferenceManager.getDefaultSharedPreferences(LoginActivity.myContext).edit().putString("cookie", new_cookie).commit();
benutzt, jetzt gehts, keine Exception mehr.

Vielen Dank fuer die Hilfe reallord!
 
Schön. :scared:

Erklärt zwar noch nicht, warum das ursprüngliche context (als Parameter null ist), aber was soll's.

Viel Erfolg noch und einen guten Rutsch ins neue Jahr.
 
reallord schrieb:
Schön. :scared:

Erklärt zwar noch nicht, warum das ursprüngliche context (als Parameter null ist), aber was soll's.

Viel Erfolg noch und einen guten Rutsch ins neue Jahr.
Ja, Ich basstle herum mit der "httpsurlconnection" (weil ja defaulthttpclient deprecated ist) um einen erfolgreichen Login hinzubekommen um mir einige Daten zu parsen aber es klappt nicht so ganz. Jedenfalls ist die Cookiesache jetzt geloesst.
Ich wuensche dir auch einen guten Rutsch ins neue Jahr und nochmals vielen Dank fuer deine Zeit und Hilfe, Heute noch kurz zur Arbeit und dann Urlaub :)
 

Ähnliche Themen

L
Antworten
15
Aufrufe
890
jogimuc
J
M
Antworten
4
Aufrufe
1.150
swa00
swa00
5
Antworten
0
Aufrufe
1.117
586920
5
Zurück
Oben Unten