Support lib LruCache throws NullPointerException: key == null || value == null for some reason

谁都会走 提交于 2020-01-07 08:00:35

问题


I've been trying to understand how to use the LruCache to combat the problem of outOfMemory errors in the lower APIs however I've been having trouble implementing it correctly.

For some reason when I try to put a Drawable and url string in cache as an identifier the system throws a nullpointerexception: Key == null || value == null error which is a new kind of error to me. I have searched around the internet but it seems no one else has had this kind of error.

Any Ideas on what is going wrong in my implementation?

public class RedditIconTask {
private static final String debugTag = "ImageWorker";

private HashMap<String, Drawable> imageCache;
private LruCache<String,Drawable> imgCache;
private static Drawable DEFAULT_ICON = null;
private BaseAdapter adapter;
private Boolean cancelled = false;


public RedditIconTask (Context context)
{
    final int maxMem = (int)(Runtime.getRuntime().maxMemory()/1024);
    final int cacheSize = maxMem/8;
    imgCache = new LruCache<String, Drawable>(cacheSize);
    //sets faux-image cache in form of HashMap stores drawables in memory
    imageCache = new HashMap<String, Drawable>();

}

public Drawable loadImage (BaseAdapter adapt, ImageView view)
{
    //checks if image is in memory and makes a call to Reddit Icon task if imaage must be downloaded again.
    this.adapter = adapt;
    String url = (String) view.getTag();
    if (imgCache.get(url)!= null)
    {
        return getDrawableFromMemCache(url);
    }
    else {
        new ImageTask().execute(url);
        return DEFAULT_ICON;
    }
}
//receives cancel async task request from MainFragment on Pause
public void stopImage (Boolean stop){
        cancelled=stop;
    Log.v(debugTag,"Stop AsyncTask");

}
//sets state of cancelled variable
public boolean cancelled (){
    return cancelled;

}
public Drawable getDrawableFromMemCache(String key) {
    return  imgCache.get(key);
}

public class ImageTask extends AsyncTask<String, Void, Drawable>
{
    private String s_url;

    //accepts array of urls to down load
    @Override
    protected Drawable doInBackground(String... params) {
        //checks the cancelled variable to determine whether to continue AsyncTask
       if (cancelled()){
           cancel(cancelled);
        //checks urls for drawable types
       }else {
           s_url = params[0];
           InputStream inStream;
           Drawable picture = null;
           try {
               Log.v(debugTag, "Fetching: " + s_url);


               URL url = new URL(s_url);
               inStream = url.openStream();
               picture = Drawable.createFromStream(inStream, "src");

           } catch (MalformedURLException e) {
               Log.v(debugTag, "Malformed: " + e.getMessage());
           } catch (IOException e) {
               Log.d(debugTag, "I/O : " + e.getMessage());

           }

           imgCache.put(s_url, picture);
           return picture;
       }
        return null;
    }

    @Override
    protected void onPostExecute(Drawable result) {
        super.onPostExecute(result);

            //adds resulting drawable to memory



        //updates adapter view
        adapter.notifyDataSetChanged();
    }

}

}


回答1:


s_url is null or picture is null.

Check for null before adding to cache:

if(s_url!=null && picture!=null)
    imgCache.put(s_url, picture);
else
    Log.d(debugTag, "Put in cache failed for url:"+s_url+" and pict:"+picture);


来源:https://stackoverflow.com/questions/24921696/support-lib-lrucache-throws-nullpointerexception-key-null-value-null-f

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!