2012-11-21 5 views
7

मेरे पास एक विजेट है जो xml फ़ीड को पार करता है और इसका शीर्षक और छवि प्रदर्शित करता है। इस विजेट में मैं ऐसी सेवा का उपयोग कर रहा हूं जो समय-समय पर सामग्री (यानी शीर्षक और छवि) को बदलता है। यह मैं टाइमर क्लास का उपयोग कर रहा हूं। जब हम इस विजेट को चलाते हैं, तो कुछ सामग्री बिना किसी समस्या के प्रदर्शित होती है लेकिन कुछ समय बाद यह बंद हो जाती है और एक त्रुटि दिखाती है जैसे "विजेट अपडेट के लिए रिमोट व्यू अधिकतम बिटमैप मेमोरी उपयोग से अधिक है (प्रयुक्त: 2465280 अधिकतम: 2304000) डिवाइस की स्क्रीन को भरने के लिए आवश्यक कुल मेमोरी एक से अधिक नहीं हो सकती है "। मेरी AppwidgetProvider कृपया कुछ भी मुझे इस समस्या को हल करने में मदद ... अग्रिमविजेट अद्यतन के लिए रिमोट व्यू अधिकतम बिटमैप मेमोरी उपयोग त्रुटि से अधिक

यहाँ धन्यवाद है =>

public class myappwidgetprovider extends AppWidgetProvider { 
    public static String urls="http://www.abc.com/en/rssfeeds/9/latest/rss.xml"; 
    // XML node keys 
    static final String KEY_HEAD = "item"; // parent node 
    //static final String KEY_TITLE = "title"; 
    static final String KEY_DATE = "pubDate"; 
    public static String headflag="english"; 
    public static String[] Title; 
     public static String[] Description; 
     public static String[] Tit; 
     public static String[] Tit2; 
     public static String[] Desc; 
     public static String[] Desc2; 
     public static String[] image; 
    public static TextView flashnews; 

    public static int i=0; 

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
     { 

     Log.i("Tag", "onCreateView"); 
     parse(); 


      RemoteViews remoteViews; 
         ComponentName thisWidget = new ComponentName(context,myappwidgetprovider .class); 

       int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 

       Intent intent = new Intent(context.getApplicationContext(), 
         Updatewidget.class); 
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); 
          context.startService(intent); 

       } 





    public static void parse() 
    { 

      URL url; 

      try { 

       url = new URL(urls); 
       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
       if((conn.getResponseCode() == HttpURLConnection.HTTP_OK)){ 
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
         DocumentBuilder db = dbf.newDocumentBuilder(); 
         Document doc; 
         doc = db.parse(url.openStream()); 
         doc.getDocumentElement().normalize(); 

         NodeList itemLst = doc.getElementsByTagName("item"); 
         Description = new String[itemLst.getLength()];//........ 
         Title = new String[itemLst.getLength()]; 
         Tit=new String[itemLst.getLength()]; 
         Tit2=new String[itemLst.getLength()]; 
         Desc=new String[itemLst.getLength()]; 
         Desc2=new String[itemLst.getLength()]; 
         image= new String[itemLst.getLength()]; 

         for(int i=0; i < itemLst.getLength(); i++){ 

          Node item = itemLst.item(i); 
          if(item.getNodeType() == Node.ELEMENT_NODE){ 
            Element ielem = (Element)item; 
            NodeList title = ielem.getElementsByTagName("title"); 
            NodeList date = ielem.getElementsByTagName("pubDate"); 
            NodeList description = ielem.getElementsByTagName("description"); 
            Tit[i]= title.item(0).getChildNodes().item(0).getNodeValue(); 
            Desc[i]= description.item(0).getChildNodes().item(0).getNodeValue(); 
            Tit2[i]=Translate.title(Tit[i]); 
            Desc2[i]=Translate.description(Desc[i]); 
            if(headflag=="malayalam") 
            { 
             Desc2[i]=Desc2[i].replace("read more","IqSpXÂ"); 
            } 
            Title[i] =Tit2[i]; 
            if (Desc2[i].contains("<img ")){ 
             String img = Desc2[i].substring(Desc2[i].indexOf("<img ")); 
             String cleanUp = img.substring(0, img.indexOf(">")+1); 
             img = img.substring(img.indexOf("src=") + 5); 
             int indexOf = img.indexOf("'"); 
             if (indexOf==-1){ 
              indexOf = img.indexOf("\""); 
             } 
             img = img.substring(0, indexOf); 

           //setImgLink(img); 
            if(headflag=="malayalam") 
            { 
             String img2=img.replace("files","files/imagecache/android_320"); 
             Description[i]=Desc2[i].replace(img,img2); 
             image[i]=img2; 
            } 

           else 
           { 
            String img2=img.replace("files","files/imagecache/android_1_img"); 
            Description[i]=Desc2[i].replace(img,img2); 
            image[i]=img2; 
           } 
            } 
           else 
           { 
            Description[i] =Desc2[i]; 
           } 



          } 

          } 

         } 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (DOMException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ParserConfigurationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (SAXException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
    } 

} 

और यहाँ मेरी सेवा है =>

public class Updatewidget extends Service { 
    static String UPDATEMOOD ="UPDATEMOOD"; 
    public Intent newintent; 
    public AppWidgetManager app; 
    public RemoteViews newviews; 
    public int[] newappid; 
    int i=0; 
    @Override 
    public void onStart(final Intent intent, int startId) { 

     Log.i("Tag", "Service Called!!!!!!!!!!!!!"); 

     newintent=intent; 
       int[] allWidgetIds = intent 
        .getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); 
     newappid=allWidgetIds; 

     final AppWidgetManager appWidgetMan = AppWidgetManager.getInstance(this); 
     app=appWidgetMan; 
     final RemoteViews views = new RemoteViews(this.getPackageName(),R.layout.widget_main); 
     newviews=views; 
     views.setTextViewText(R.id.title, myappwidgetprovider.Title[0]); 
     Bitmap bitmap; 
      try { 
       bitmap = BitmapFactory.decodeStream((InputStream)new URL(myappwidgetprovider.image[0]).getContent()); 


       views.setImageViewBitmap(R.id.imageView4, bitmap); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     appWidgetMan.updateAppWidget(allWidgetIds, views); 

     new ProgressAsyncTask().execute(); 








    } 



    public class ProgressAsyncTask extends 
     AsyncTask<Void, Integer, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      int delay = 5000; // delay for 5 sec. 

      int period = 5000; // repeat every sec. 

      Timer timer = new Timer(); 
       timer.scheduleAtFixedRate(new TimerTask() { 

        public void run() { 
         i++; 
         if(i==5) 
         { 
          i=0; 
         } 

         int[] allWidgetIds = newintent 
            .getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); 
           newviews.setTextViewText(R.id.title, myappwidgetprovider .Title[i]); 
         Bitmap bitmap; 
          try { 
           bitmap = BitmapFactory.decodeStream((InputStream)new URL(myappwidgetprovider .image[i]).getContent()); 


           newviews.setImageViewBitmap(R.id.imageView4, bitmap); 
          } catch (MalformedURLException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } catch (IOException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
         app.updateAppWidget(allWidgetIds, newviews); 
           } 


        }, delay, period); 
      return null; 
     } 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 





} 

उत्तर

6

मैं सिर्फ हल एक इसी तरह की समस्या। लेकिन मैं वेब से कोई सामग्री लोड नहीं कर रहा था। मेरा विजेट विभिन्न विजेट आकारों के लिए अलग-अलग छवियां प्रदर्शित कर रहा था। और कुछ स्क्रीनों के लिए वही त्रुटि थी जैसे आपका विजेट 4x4 प्रदर्शित करता था।

यही तो मैं developer.google.com पर मिल गया है:

कुल बिटमैप RemoteViews वस्तु के द्वारा प्रयोग किया अधिक नहीं हो सकता याद है कि, स्क्रीन 1.5 गुना को भरने के लिए यानी की आवश्यकता है। (स्क्रीन चौड़ाई x स्क्रीन ऊंचाई x 4 x 1.5) बाइट्स।

तो मैं इस आवश्यकता को पूरा करने के लिए विजेट में अपने बिटमैप आकार पर प्रतिबंध लगाने में सक्षम था।

आपके विशेष मामले में त्रुटि तब होती है जब धारा से बिटमैप लोडिंग संभव से बड़ा होता है।

मैं

सार्वजनिक स्थैतिक बिटमैप decodeStream की ussage (InputStream है, रेक्ट outPadding, BitmapFactory.Options चुनता है) लगता है

उचित विकल्प के साथ मदद करनी चाहिए। (संभव है कि आपको नमूना आकार विकल्प में उपयोग करने की आवश्यकता है)।

आशा है कि मेरी पोस्ट सहायक थी।

+0

मुझे लगता है कि मैंने उस समस्या को हल किया है। वैसे भी, इसके लिए धन्यवाद :) –

+0

@Rusanovskiy Artem: आप कैसे जानते हैं कि 'decodeStream() 'को पास करने के लिए कौन से विकल्प हैं? यदि आपके पास विजेट में चार बिटमैप हैं, और आप नहीं जानते कि स्रोत छवियों का आकार किस प्रकार है, तो आप कैसे जानते हैं कि 'अपवाद' को रोकने के लिए आपको किस 'नमूना आकार' का उपयोग करना है? – caw

+6

@ बासिमशेरिफ: क्या आप समझा सकते हैं कि आपने अपनी समस्या का हल कैसे किया? – caw

1
Glide.with(mContext) 
     .load(imageUrl) 
     .override(480, 342) 

....

ओवरराइड (...) मेरे लिए चाल किया था। कोई और त्रुटि नहीं है: विजेट अद्यतन के लिए रिमोट व्यू अधिकतम बिटमैप मेमोरी उपयोग त्रुटि से अधिक

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