我在Android java教程中使用了以下代码。
代码全部位于应用程序主java文件onCreate方法中,我想将XML处理部分移动到单独的类中。
我尝试过这几种不同的方式,但是所有这些方式最终都失败了,并且变得更加繁琐,以至于它们值得。
所以我的问题是,是否有一种好的/标准的方法可以将代码移出主java文件并进入单独的类?
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView myXmlContent = (TextView)findViewById(R.id.my_xml);
String stringXmlContent;
try {
stringXmlContent = getEventsFromAnXML(this);
myXmlContent.setText(stringXmlContent);
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private String getEventsFromAnXML(Activity activity)
throws XmlPullParserException, IOException
{
StringBuffer stringBuffer = new StringBuffer();
Resources res = activity.getResources();
XmlResourceParser xpp = res.getXml(R.xml.myxml);
String elType = "mt";
int counter = 1;
int mainTopics = 0;
int subTopics = 0;
xpp.next();
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT)
{
if(eventType == XmlPullParser.START_DOCUMENT)
{
stringBuffer.append("News Categories");
}
else if(eventType == XmlPullParser.START_TAG)
{
if(xpp.getName().equalsIgnoreCase("subTopic")) {
elType = "st";
subTopics += 1;
} else if(xpp.getName().equalsIgnoreCase("mainTopic")) {
elType = "mt";
mainTopics += 1;
} else {
elType = "";
}
//stringBuffer.append("\nSTART_TAG: "+xpp.getName());
}
else if(eventType == XmlPullParser.END_TAG)
{
//stringBuffer.append("\nEND_TAG: "+xpp.getName());
}
else if(eventType == XmlPullParser.TEXT)
{
if(elType.equalsIgnoreCase("st")) {
stringBuffer.append("\n *"+xpp.getText());
} else {
stringBuffer.append("\n " + counter + ") " + xpp.getText());
counter+= 1;
}
}
eventType = xpp.next();
}
//stringBuffer.append("\n--- End XML ---");
stringBuffer.append("\n Total Topics: " + mainTopics + " Total SubTopics: " + subTopics);
return stringBuffer.toString();
}
我让这个工作:将它移动到另一个名为readXML的类中,如下所示:
readXML processXml = new readXML();
try {
stringXmlContent = processXml.getEventsFromAnXML(this);
myXmlContent.setText(stringXmlContent);
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我刚刚在新类
中包装了“private String getEventsFromAnXML”方法 像这样:public class readXML {
private String getEventsFromAnXML(Activity activity)
....process XML...
}
答案 0 :(得分:1)
听起来像AsyncTask非常适合你想做的事情。 (http://developer.android.com/resources/articles/painless-threading.html)
您可以将处理代码移至doInBackground()
,并在方法TextView
中更新onPostExecute()
。另外,您可以在TextView
构造函数中传递AsyncTask
的引用。
答案 1 :(得分:1)
通常,您选择的IDE允许执行“重构”,这允许您将方法移动到其他类,然后您可以使用它们。
是的,将方法提取到其他类中非常常见。
答案 2 :(得分:1)
您应该使用抽象上下文类来执行此操作:
将xml解析器方法的参数类型更改为:
private String getEventsFromAnXML(Context ctx)
{
....
Resources res = ctx.getResources();
....
}
并从您的活动中调用它:
public void onCreate(Bundle savedInstanceState)
{
.....
ctx = this.getApplicationContext();
stringXmlContent = getEventsFromAnXML(ctx);
.....
}
希望这有效!