A new problem has shown up with my app, which appears to affect only certain 
devices. I don't have a lot of information about the failure, but my current 
best guess is it appears to be failing to read or parse an internal XML 
resource.  

I read one of several XML files from res/xml and use that to dynamically 
initialize a java class / data structure (ie: coordinates of bitmaps based 
on a skin definition -- not device, region, or resolution dependent). 
 There's nothing device-specific there, so it seems like if that had a 
problem, it wouldn't be specific to any one device.  And that method has 
been working fine for a long time, across many resolutions, languages, and 
devices from 1.5 to 2.2+  -- but I recently got a vague report that suggests 
it's not working with a Sanyo / Kyocera Zio (on Cricket) running 1.6  -- and 
possibly also on some tablet of unknown make and model (but not a Galaxy 
Tab).  The failure mode suggests that it is able to find the XML from the 
resources, but the data is not making it from the XML to the java class.  

If I had access to a device (or a patient tester with one) I could probably 
solve this with detailed logging, but at the moment, I'm stuck.  Does anyone 
have any ideas or similar experience?

-----------

Here is the code for the class which takes a Resource and ID and a Java 
object and assigns any properties with the same name in the XML to the Java 
object. (apologies if this method is outdated / bad practice / etc.  I wrote 
it when I was just starting on Android and java is not my native tongue.).  

package lars.FlightPanel;

import org.xmlpull.v1.XmlPullParser;
import android.content.res.Resources;
import java.lang.reflect.*;
import java.lang.Class;

public class XMLClassReader
{

private static final String TAG = "XMLClassReader";
private String lead_tag;
private boolean verbose = false;


XMLClassReader () { } ;

public Object Read (int resourceID, Object target,Resources R)
{
XmlPullParser xpp = R.getXml(resourceID);
return Read (xpp,target);
}

////////////////////////////////////////////////////////////////////////////////////////////////////
public Object Read (XmlPullParser xpp, Object target)
{

lead_tag = "XMLParser: ";
try
{
int eventType = xpp.getEventType();
while (eventType!=XmlPullParser.END_DOCUMENT)
{
if (eventType==XmlPullParser.START_TAG)
ReadTag(xpp, target.getClass(),target);
eventType = xpp.next();
}
Field fld = target.getClass().getDeclaredField("XML_Loaded");
// FlightPanel.LocalLog(TAG, lead_tag+"field is " + fld + " in " + target);
if (fld!=null)
fld.setInt (target, Integer.parseInt("1"));
FlightPanel.LocalLog(TAG, lead_tag+" done loading all.");
}
catch (Exception e)
{

e.printStackTrace();
FlightPanel.LocalLog(TAG, lead_tag+" error " + e.toString());
}
return target;

}

////////////////////////////////////////////////////////////////////////////////////////////////////
private void ReadTag (XmlPullParser xpp, Class cls,Object target)
{
String orig_lead_tag = lead_tag;
lead_tag+="\t";
try
{
String thistag = xpp.getName();
if (verbose ) FlightPanel.LocalLog(TAG, lead_tag+" starting parsing of XML 
tag " + thistag);
if (verbose) FlightPanel.LocalLog(TAG, lead_tag+" - into class " + 
cls.getName() + " containing :");
Field[] flds = cls.getDeclaredFields();
for (int x=0;x<flds.length;x++)
if (verbose)  FlightPanel.LocalLog(TAG, lead_tag+" -- " + flds[x].getName() 
+ " \t " + flds[x]);
int index;

// read the primitives out as attributes
for (index = 0; index < xpp.getAttributeCount();index++)
{
String attributeName = xpp.getAttributeName(index);
try
{
Field fld = cls.getDeclaredField(attributeName);
String value = xpp.getAttributeValue(index);
if (verbose) FlightPanel.LocalLog(TAG, lead_tag+" = matched XML attribute " 
+ attributeName + "\t assigning value "+ value);
String typname = fld.getType().getName();
if (verbose) FlightPanel.LocalLog(TAG, lead_tag+" == to field \t" + fld + " 
of type " + fld.getType() + " \t "  + typname);
if (verbose) FlightPanel.LocalLog(TAG, lead_tag+" == on object \t" + target 
+ "  \t " + target.getClass());
if (typname.equals("int"))
fld.setInt (target, Integer.parseInt(value));
else if (typname.equals("float"))
fld.setFloat (target, Float.parseFloat(value));
else if (typname.equals("boolean"))
fld.setBoolean (target, Boolean.parseBoolean(value));
else if (typname.equals("double"))
fld.setDouble (target, Double.parseDouble(value));
else if (typname.equals("byte"))
fld.setByte (target, Byte.parseByte(value));
else if (typname.equals("short"))
fld.setShort (target, Short.parseShort(value));
else if (typname.equals("long"))
fld.setLong (target, Long.parseLong(value));
// todo:  add strings and arrays


//
}
catch (Exception e)
{
FlightPanel.LocalLog(TAG, lead_tag+" error no field matching XML attribute " 
+ attributeName);
FlightPanel.LocalLog(TAG, lead_tag+" error " + e.toString());
}

}

// read any subclasses
xpp.next();
int eventType = xpp.getEventType();
while (eventType!=XmlPullParser.END_DOCUMENT && 
eventType!=XmlPullParser.END_TAG)
{
if (xpp.getEventType()==XmlPullParser.START_TAG)
{
String tagname = xpp.getName ();
if (verbose) FlightPanel.LocalLog(TAG, lead_tag+" >> diving into complex XML 
tag  " + tagname);
try
{
Field fld = cls.getDeclaredField(tagname);
ReadTag(xpp, fld.getType(), fld.get(target));
}
catch (Exception e)
{
FlightPanel.LocalLog(TAG, lead_tag+" error  no field matching XML tag " + 
tagname);
FlightPanel.LocalLog(TAG, lead_tag+" error " + e.toString());
}
}
eventType = xpp.next();
}

if (verbose) FlightPanel.LocalLog(TAG, lead_tag+" done with  " + thistag);

}
catch (Exception e)
{
e.printStackTrace();
FlightPanel.LocalLog(TAG, lead_tag+" error " + e.toString());
}
lead_tag = orig_lead_tag;
}

////////////////////////////////////////////////////////////////////////////////////////////////////

}

--------------------
and the system & build report from the one offending device's profile is: 

zio cricket
DRC92
cricket/zio/msm7627_kb60/zio:1.6/DRC92/Android.1.002CR.1:user/ota-rel-keys,release-keys
TAGS:release-keys
1281453694000
user DRC92 Android-BS7 cmd_public


-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to