2012-11-21 11 views
7

xml özet akışını ve başlığını ve görüntüsünü görüntüleyen bir widget'ım var. Bu widget'ta, içeriği (ör. Başlık ve resim) periyodik olarak değiştiren bir hizmet kullanıyorum. Bu zamanlayıcı sınıfını kullanıyorum. Bu widget'ı çalıştırdığımızda, bazı içerikler herhangi bir sorun olmadan görüntüleniyor, ancak bir süre sonra kapanıyor ve bir hata gösteriliyor "Widget güncellemesi için RemoteViews maksimum bitmap bellek kullanımını aşıyor (kullanıldı: 2465280 max: 2304000) toplam bellek, cihazın ekranını bir kez doldurmak için gerekli olan süreyi geçemez ". Bazı biri bana bu sorunu çözmek için yardım edin ... İşte Widget güncellemesi için RemoteViews, max bitmap bellek kullanım hatasını aşıyor

peşin

teşekkürler benim AppwidgetProvider İşte =>

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

} 

Ve hizmettir =>

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





} 

cevap

6

Sadece çözüldü benzer bir problem. Ancak web'den hiçbir içerik yüklemiyordum. Widget'ım farklı widget boyutları için farklı görüntüler gösteriyordu. Ve bazı ekranlar için widget 4x4'ü görüntüleyenle aynı hata oluştu.

Ben developer.google.com bulunan kadarıyla:

, ekranı yani 1.5 kat doldurmak için gerekli geçemez RemoteViews nesnesi tarafından kullanılan toplam Bitmap bellek. (ekran genişliği x ekran yükseklik x 4 x 1,5) bayt.

Bu nedenle, yalnızca bu gereksinime uyması için pencere eşiğindeki bitmap boyutuma bir kısıtlama koyabiliyordum.

Özel durumunuzda, akıştan bir bitmap yüklemesi mümkün olduğunda daha büyük olduğunda hata oluşur.

düzgün seçenekleri ile

yardımcı olmalıdır

kamu statik Bitmap decodeStream ait ussage (inputStream olduğunu Rect'iniz outPadding, BitmapFactory.Options seçmesi) düşünüyorum. (inSampleSize seçeneğini kullanmanız gerekebilir). Mesajımın yardımcı olacağını umuyorum.

+0

Bu sorunu çözdüğümü düşünüyorum. Her neyse, bunun için teşekkürler :) –

+0

@Rusanovskiy Artem: decodeStream() 'ye hangi seçeneklerin geçeceğini biliyor musunuz? Widget'ta dört bitmap varsa ve kaynak görüntülerin hangi boyutta olduğunu bilmiyorsanız, bu 'Exception'ı önlemek için hangi' sampleSize '' i kullanmak zorunda olduğunuzu nereden biliyorsunuz? – caw

+6

@BasimSherif: Sorununuzu nasıl çözdüğünüzü açıklar mısınız? – caw

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

....

geçersiz kılma (...) Benim için hile yaptı. Artık hatalar yok: Widget güncellemesi için RemoteViews, max bitmap bellek kullanım hatasını aşıyor