2016-08-26 2 views
0
public void add(HttpUrl url, Cookie cookie) { 
    String name = getCookieToken(cookie); 

    //将cookies缓存到内存中 如果缓存过期 就重置此cookie 
    if (!cookie.persistent()) { 
     if (!cookies.containsKey(url.host())) { 
      cookies.put(url.host(), new ConcurrentHashMap<String, Cookie>()); 
     } 
     cookies.get(url.host()).put(name, cookie); 
    } else { 
     if (cookies.containsKey(url.host())) { 
      cookies.get(url.host()).remove(name); 
     } 
    } 

    LogUtil.e("Cookie:" + cookies.get(url.host()).keySet().toString()); 
    //讲cookies持久化到本地 
    SharedPreferences.Editor prefsWriter = cookiePrefs.edit(); 
    prefsWriter.putString(url.host(), TextUtils.join(",", cookies.get(url.host()).keySet())); 
    prefsWriter.putString(name, encodeCookie(new SerializableOkHttpCookies(cookie))); 
    prefsWriter.apply(); 
} 

public List<Cookie> get(HttpUrl url) { 
    ArrayList<Cookie> ret = new ArrayList<>(); 
    if (cookies.containsKey(url.host())) 
     ret.addAll(cookies.get(url.host()).values()); 
    return ret; 
} 

Когда я okhttp3 создать печенье упорства, был исключением:OkHttp3 Cookie Persistent

NullPointerException: Attempt to invoke virtual method 'java.util.Set java.util.concurrent.ConcurrentHashMap.keySet()' on a null object reference 

Многие люди говорят, что это из-за версии JDK1.8 возвращаемого значения ConcurrentHashMap, но я не знаю, как решить. Моя версия JDK - 1,8.

ответ

0

Ваш метод добавления имеет два не нужных безопасного обращения к карте Cookies. Я думаю, просто отредактируйте эти две строки, чтобы использовать метод безопасного получения или использовать нулевые проверки.

От:

LogUtil.e("Cookie:" + cookies.get(url.host()).keySet().toString()); 

To:

if (cookies.containsKey(url.host())) 
    LogUtil.e("Cookie:" + cookies.get(url.host()).keySet().toString()); 

и этой линии также

prefsWriter.putString(url.host(), TextUtils.join(",", cookies.get(url.host()).keySet())); 
Смежные вопросы