支持lib LruCache抛出NullPointerException:key == null ||由于某种原因,value == null

时间:2014-07-23 21:52:49

标签: android image caching android-asynctask

我一直试图了解如何使用LruCache来解决较低API中outOfMemory错误的问题,但是我一直无法正确实现它。

出于某种原因,当我尝试将高速缓存中的Drawable和url字符串作为标识符时,系统会抛出nullpointerexception:Key == null || value == null error这对我来说是一种新的错误。我在互联网上搜索过,但似乎没有其他人有过这种错误。

关于我的实施中出了什么问题的任何想法?

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 个答案:

答案 0 :(得分:2)

s_url为null或图片为空。

在添加到缓存之前检查null:

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);