将代码移出onCreate方法并移入自己的类文件中

时间:2012-01-04 16:31:57

标签: java android

我在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...
}

3 个答案:

答案 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);
  .....

}

希望这有效!