2012-11-21 9 views
7

Ho un widget che analizza il feed xml e ne visualizza il titolo e l'immagine.In questo widget sto usando un servizio che periodicamente cambia il contenuto (es. Titolo e immagine) .Per sto usando la classe del timer. Quando eseguiamo questo widget, alcuni contenuti vengono visualizzati senza problemi, ma dopo un po 'forzatamente si chiude e mostra un errore come "RemoteViews per l'aggiornamento del widget supera l'utilizzo massimo della memoria bitmap (usato: 2465280 max: 2304000) la memoria totale non può superare quella richiesta per riempire lo schermo del dispositivo una volta ". Si prega di qualcuno mi aiuti a risolvere questo problema ... Grazie in anticipoRemoteViews per l'aggiornamento del widget supera l'errore di utilizzo della memoria bitmap max

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

} 

e qui è il mio servizio =>

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





} 

risposta

6

ho appena risolto un problema simile Ma non stavo caricando alcun contenuto dal web. Il mio widget stava visualizzando immagini diverse per dimensioni di widget diverse. E per alcuni schermi si è verificato lo stesso errore di visualizzazione del widget 4x4.

Che ciò che ho trovato su developer.google.com:

La memoria Bitmap totale utilizzata dall'oggetto RemoteViews non può superare che ha richiesto per riempire lo schermo di 1,5 volte, vale a dire. (schermo larghezza x schermo altezza x 4 x 1,5) byte.

Quindi sono stato in grado di inserire una limitazione sulla dimensione del mio bitmap nel widget per soddisfare questo requisito.

Nel tuo caso particolare l'errore si verifica quando un caricamento bitmap dal flusso è maggiore di quanto possibile.

penso che l'ussage di

decodeStream pubblico Bitmap statico (InputStream è, Rect outPadding, BitmapFactory.Options opta)

con le opzioni appropriate dovrebbe aiutare. (possibile è necessario utilizzare l'opzione inSampleSize).

Spero che il mio post sia stato utile.

+0

Penso di aver risolto il problema. Comunque, Grazie per questo :) –

+0

@Rusanovskiy Artem: Come fai a sapere esattamente quali opzioni passare a 'decodeStream()'? Se si dispone, ad esempio, di quattro bitmap nel widget e non si conosce la dimensione delle immagini di origine, come si fa a sapere quale 'sampleSize' deve essere utilizzato per impedire tale 'eccezione'? – caw

+6

@BasimSherif: Potresti spiegare come hai risolto il problema? – caw

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

....

l'override (...) ha fatto il trucco per me. Non più errori come: RemoteViews per l'aggiornamento del widget supera l'errore di utilizzo della memoria bitmap max

Problemi correlati