用于小部件更新的RemoteViews超出最大位图内存使用错误

我有一个小部件,它parsingXML feed,并显示它的标题和图像。在这个小部件中,我使用了一个定期更改内容(即标题和图像)的服务。为此,我使用timer类。当我们运行这个小部件时,一些内容显示没有任何问题,但在某些时候它强制closures,并显示错误,如“小部件更新RemoteViews超过最大位图内存使用(使用: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; } } 

Solutions Collecting From Web of "用于小部件更新的RemoteViews超出最大位图内存使用错误"

我刚刚解决了一个类似的问题。 但我没有加载任何来自networking的内容。 我的小部件显示不同的小部件大小不同的图像。 而对于一些屏幕,与你的显示小部件4×4一样的错误。

这是我在developer.google.com上find的:

RemoteViews对象使用的总位图内存不能超过填充屏幕1.5倍所需的内存量,即。 (屏幕宽度×屏幕高度×4×1.5)字节。

所以我只能在小部件中对我的位图大小加以限制以适应此要求。

在你的特定情况下,当从stream加载的位图大于可能时,发生错误。

我想到了

公共静态位图decodeStream(InputStream是,Rect outPadding,BitmapFactory.Optionsselect)

适当的select应该有所帮助。 (可能你需要使用inSampleSize选项)。

希望我的post是有帮助的。

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

….

覆盖(…)为我做了诡计。 没有更多的错误,如:小部件更新RemoteViews超过最大位图内存使用错误