android


RemoteViews for widget update exceeds max bitmap memory usage error


I have a widget that parses xml feed and display its title and image.In this widget I am using a service that periodically changes the contents(ie, title and image).For this I am using timer class.When we run this widget, some contents are displayed without any problem but after sometime it force closes and shows an error like "RemoteViews for widget update exceeds maximum bitmap memory usage(used:2465280 max:2304000) The total memory can't exceed that required to fill the device's screen once". Please some one help me to solve this issue...Thanks in advance
Here is my 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();
}
}
}
And Here is my service=>
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;
}
}
I just solved a similar problem.
But I wasn't loading any content from web.
My widget was displaying different images for different widget sizes. And for some screens there was the same error as yours displaying widget 4x4.
That what I've found at developer.google.com:
The total Bitmap memory used by the RemoteViews object cannot exceed
that required to fill the screen 1.5 times, ie. (screen width x screen
height x 4 x 1.5) bytes.
So I was able just to put a restriction on my bitmap size in widget to fit this requirement.
In your particular case the error occures when a bitmap loading from stream is larger than possible.
I think the ussage of
public static Bitmap decodeStream (InputStream is, Rect outPadding,
BitmapFactory.Options opts)
with proper options should help. (possible you need to use inSampleSize option).
Hope my post was helpful.

Related Links

android lots of bitmap images in horizontalscrollview gives out of memory
Android Project generated using Worklight 6.1, is it regenerated for each compilation?
How do I declare my ArrayAdapter GLOBAL?
Android - How to stop TimerTask by pressing a button
Use the same Landscape layout for all the activities
How to display a “zoom-able” SVG file in Android?
Android AES encryption - The constructor Base64() is not visible
Android: ListView not displaying as intended?
Android EditText with fixed number of max lines and no scrolling
Populating ListView inside Fragment class extending ListFragment
ios and android communication using emoticons
Error: hide list View child Item
Class requires API level 11 (current min is 8)
how to open edit text on specific item is selected from spinner
Android: Unable to get preference values from settings.xml
Android message Handler from Service

Categories

HOME
azure-stream-analytics
oracle12c
apache-flink
fpga
rdbms
flex
camera
jelastic
vscode-extensions
appcelerator
bitbucket-api
mapbox
webix
odoo-8
project
heap
github-enterprise
mxgraph
ycsb
ipmitool
shared-libraries
dynatrace
symbol
internationalization
symfony-2.8
fileserver
jersey-1.0
charles
babel
href
r-mice
php-mysqlidb
scriptella
monit
onload
fat
shared
datastax-enterprise-graph
bringtofront
dotspatial
installscript
fiware-cygnus
protege4
jpad
connection-pool
laravel-elixir
datacachefactory
portforwarding
subclipse
optimizely
servermanager
ovf
spring-integration-sftp
mschart
context-switch
skin
pdf-conversion
bbpress
type-theory
mach-o
mouseleave
jtree
structuremap4
vcloud-director-rest-api
angular2-testing
autosar
actor-platform
vulcanize
iotivity
nikeplus-api
phpwebsocket
findfirst
mobiledoc-kit
relativelayout
inf
linklabel
assertion
django-urls
dronekit-android
sql-server-data-tools
procedural-programming
jbake
punycode
mdichild
ss7
jjaql
synapse
mt4j
kendo-dataviz
model-driven-development
modular
mongohq
scringo
stacky
nokia-s40
node-redis
expression-blend-4
saxparseexception
u2netdk
entitydatasource
collectionviewsource
office-2007
ajax-polling
dojo-dnd
great-circle
pnrp

Resources

Encrypt Message