2013-10-06 12 views
5

मेरे आवेदन में मैं वॉली छवि लोडर का उपयोग कर रहा हूं लेकिन वहां एक मुद्दा है जिसे मैं समझ नहीं पाया। जब मैं केवल प्रतिक्रिया को कॉल कर रहा हूं .getBitmap और इसे पृष्ठभूमि छवि के रूप में सेट करें, यह ठीक है, लेकिन जब मैं कुछ कोड जोड़ता हूं उदाहरण के लिए System.out.println (response.getBitmap) यह क्रैश हो जाता है। एक शब्द में अगर मैं केवल एक बार respone.getBitmap को ठीक करता हूं, लेकिन जब यह दो बार या अधिक दुर्घटनाग्रस्त हो जाता है। यहां क्या समस्या है?वॉली छवि बिटमैप शून्य है

public class NewsAdapter extends BaseAdapter { 
    private ArrayList<News> mNewsList; 
    private DefaultActivity mActivity; 
    private ImageLoader imageLoader; 
    private RequestQueue mRequestQueue; 

    public NewsAdapter(DefaultActivity pActivity, ArrayList<News> newsList){ 
     mActivity = pActivity; 
     mNewsList = newsList; 
     mRequestQueue = Volley.newRequestQueue(mActivity); 
     imageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache(
       BitmapLruCache.getDefaultLruCacheSize())); 

    } 

    private class ViewHolder { 
     public ImageView networkImageView; 
     public TextView title; 
     public TextView description; 
    } 

    @Override 
    public int getCount() { 
     return mNewsList.size(); 
    } 

    @Override 
    public News getItem(int i) { 
     return mNewsList.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return 0; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     final ViewHolder viewHolder; 
     final News news = getItem(i); 

     if (view == null){ 
      final LayoutInflater li = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = li.inflate(R.layout.orange_news_item, viewGroup, false); 
      viewHolder = new ViewHolder(); 
      viewHolder.networkImageView = (ImageView)view.findViewById(R.id.imageView); 
      viewHolder.title = (TextView)view.findViewById(R.id.title); 
      viewHolder.description = (TextView)view.findViewById(R.id.description); 

      view.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) view.getTag(); 
     } 
     viewHolder.title.setText(Html.fromHtml(news.getTitle())); 
     viewHolder.description.setText(Html.fromHtml(news.getBody())); 
     imageLoader.get(news.getImageThumbUrl(),new ImageLoader.ImageListener() { 
      @Override 
      public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 
        viewHolder.networkImageView.setImageBitmap(response.getBitmap()); 
        System.out.println("bitmap="+response.getBitmap()); 
        System.out.println("width="+response.getBitmap().getWidth()); 
        System.out.println("height="+response.getBitmap().getHeight()); 
      } 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       //To change body of implemented methods use File | Settings | File Templates. 
      } 
     }); 


     return view; 
     } 

} 
+0

दुर्घटना क्या है? –

उत्तर

3

मैं कुछ सलाह दे सकता है और आप अपने कोड की जांच कर सकते हैं:

  • एक बार onResponse कहा जाता है, एक null के लिए बिटमैप जाँच, यह हो सकता है कारण null

    Bitmap bitmap = response.getBitmap(); 
    if (bitmap != null) { 
        //TODO other code is here 
    } 
    
  • साथ ही आप new BitmapLruCache()

    जोड़कर कैशिंग को सक्रिय कर सकते हैं
    RequestQueue mRequestQueue = Volley.newRequestQueue(this); 
    imageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache()); 
    

आप BitmapLruCache प्राप्ति here मिल सकती है।

  • new BitmapLruCache() में आप जाँच कर सकते हैं (डिबग या लॉग इन करें) कैसे बिटमैप्स जमा हो जाती है और वे कैसे कैश

    @Override 
    public Bitmap getBitmap(String url) { 
        return get(url); //debug or log 
    } 
    
    @Override 
    public void putBitmap(String url, Bitmap bitmap) { 
        if (bitmap != null) { 
         put(url, bitmap); 
        } 
    } 
    

से लिया गया रहे हैं, तो समस्या अभी भी यहाँ है, कृपया अधिक जानकारी जोड़ें।

+2

उत्कृष्ट जवाब! मेरा एकमात्र प्रश्न यह है कि बिटमैप 'onResponse' विधि में क्यों शून्य हो सकता है? मेरी समझ यह है कि यह अभी तक पूरी तरह से लोड नहीं हुआ है, लेकिन फिर, मैं कैसे जान सकता हूं कि यह कब होगा? असल में वे 2 प्रश्न थे;)। – acrespo

+0

@acrespo लगभग एक साल बाद, लेकिन अभी भी आपके द्वारा अभी दिए गए उत्तर में रुचि हो सकती है। – jmacedo

+1

मैंने पाया कि कैश कार्यान्वयन में 'putBitmap()' में 'put'' पर कॉल के चारों ओर 'बिटमैप! = Null' कॉल को जोड़ने के लिए यह बेहतर काम करता है। यह त्रुटि छवियों को अनावश्यक रूप से फिर से लोड करने का प्रयास कर सकता है- लेकिन वहां बिना शून्य जांच के भी, कभी-कभी यह एक खाली बिटमैप को कैश करता है जब यह पूरा पूरा करने के लिए समय देता है यदि आप अनुरोध को पूरा करने के लिए समय देते हैं। –

8

validcat के जवाब देने के लिए एक अतिरिक्त के रूप में:

onResponse() जब यह और छवि को लाने के लिए शुरू होता है आप एक तत्काल प्रतिक्रिया के साथ एक अशक्त बिटमैप देता है अगर छवि ImageLoader कैश में नहीं है। बाद में, अगर सबकुछ ठीक हो जाता है, तो इसे फिर से बुलाया जाता है, इस बार एक गैर-शून्य बिटमैप के साथ।

यह छवि लोड होने पर लोडिंग स्क्रीन या प्रगति पट्टी सेट करने की अनुमति देता है (जब onResponse() तत्काल शून्य देता है) और प्राप्त होने पर प्राप्त छवि को स्क्रीन पर सेट करें (onResponse() एक गैर-शून्य बिटमैप देता है)।

संबंधित मुद्दे