1

我通常不寻求帮助,我总是自己研究并尝试找到解决方案,但这次我真的被困住了......我对某些语言有很多经验,但对 java 没有。 .. 所以,我想做的是一个应用程序,它具有动态布局,并从特定主机上的 XML 文件加载它。我的第一个问题显然是不可能从主线程读取 XML,所以我必须了解线程和 Asynctaks,我决定使用一个简单的线程并将值存储在我创建的一些全局变量中,但它不起作用...我也尝试将 SAX 用于 XML 解析器,但我更喜欢 DOM。我只是想这样做超过3天,我对此有点生气,我希望有人能帮助我,这是我的代码:

这是我定义我的变量的类。它们都应该处理多个值,除了 XML 值,它将存储 XML 的 URL 以在线程中使用它。

public class Info {
        public static String Param1[];
        public static String Param2[];
        public static String Param3[];
        public static String Param4[];
        public static String Param5[];
        public static String Param6[];
        public static String XML;
}

这是我的主线:

//Create the basic layout
ScrollView sv = new ScrollView(this);
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.VERTICAL);
    sv.addView(ll);
Info.XML="mylink";
Thread thread = new Thread()
{
    @Override
    public void run() {
        try {
            URL url = new URL(Info.XML);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new InputSource(url.openStream()));
            doc.getDocumentElement().normalize();
            NodeList ActionContainers = doc.getElementsByTagName("ActionContainer");
            Node mainContainer = ActionContainers.item(0);
            Element Container = (Element) mainContainer;
            NodeList Actions = Container.getElementsByTagName("Action");
            for (int i = 0; i < Actions.getLength(); i++) {
                Node mainAction = Actions.item(i);
                Element Action = (Element) mainAction;
                Info.Param1[i]=Action.getAttribute("Param1");
                Info.Param2[i]=Action.getAttribute("Param2");
                Info.Param3[i]=Action.getAttribute("Param3");
                Info.Param4[i]=Action.getAttribute("Param4");
                Info.Param5[i]=Action.getAttribute("Param5");
                Info.Param6[i]=Action.getAttribute("Param6");
            }
        } catch (Exception e) {
            Info.XML="Erro";
        }
    }
};
try{
    thread.start();
} catch(Exception e){
    Info.XML="Erro";
}

    EditText et = new EditText(this);
        et.setText(Info.XML);
        ll.addView(et);
        setContentView(sv);

没有检测到异常,它根本不返回xml信息......我希望有人可以在这里给我一点帮助。

谢谢

编辑:

这是 XML:

<appname Version="yyy" WrittenOn="yyy">
<Config>
    <Page Id="yyy">
        <ActionContainer Id="yyy">
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            <Action Param1="xxx" Param2="xxx" Param3="xxx" Param4="xxx" Param5="xxx" Param6="xxx"></Action>
            ...
        </ActionContainer>
    </Page>
</Config>

我需要所有的 xxx,如果可能的话,我想把它们放在一个多维数组上。

4

2 回答 2

0

而不是Thread你应该尝试使用AsyncTask. 看这里:

关于线程的官方android页面非常好 http://developer.android.com/resources/articles/painless-threading.html

http://developer.android.com/reference/android/os/AsyncTask.html

这也很好地解释了它 http://labs.makemachine.net/2010/05/android-asynctask-example/

关于 XML 解析,我的应用程序依赖于从 HTTP 请求中提取的大量 XML,我发现 SAX 解析器非常好,并且一旦开始使用就很容易使用。

关于 SAX 示例,它已经有很长时间没有解决了,但我在书签中找到了这个示例,希望它有所帮助。只需阅读 SAX 部分 http://www.ibm.com/developerworks/xml/library/x-android/

希望有帮助

于 2012-06-01T03:45:59.813 回答
0

我仍然认为缺少一些代码,但是为了不让您陷入困境,这里有几件事可能是错误的:

  • 你可能实际上没有得到异常,因为et.setText(Info.XML);可能在你的线程完成之前执行,忽略“ErrNo”。我对此的注释:
    • 您的 XML 文件可能存在错误的 URL(请记住,对于远程文档,您需要INTERNET在应用程序中获得权限),
    • 您发布的 XML 无效:<appname>未关闭和/或没有根元素。
    • 您似乎没有在Info.ParamX任何地方初始化数组,这将导致NullPointerException,
    • 即使你确实初始化了它们,你也没有考虑 的大小Actions.getLength(),这可能会导致一个ArrayIndexOutOfBoundsException或类似的结果;换句话说,在循环Info.ParamX = new String[Actions.getLength()];之前包含。for
    • 除此之外,您的解析代码似乎工作正常。要正确调试代码,请使用 ADT 中的 Debug 选项,或使用System.out.println()在 catch 子句中输出异常,然后在 LogCat 中检查它
  • 这段代码在哪里?如果它不在onCreate()您的活动中,请将其放在那里。

另外,一些小问题:

  • 尝试对您的 Java 字段和变量使用camelBack表示法,这将使您的代码对 Java 程序员更具可读性。
  • 将 aThread用于一次性应用程序是可以的,但您通常应该避免使用它,例如将其替换为 an AsyncTask(您已经阅读过)。

PS。在中ParamXX当然是从 1 到 6(包括 1 到 6)的每个整数。

于 2012-06-01T00:40:13.250 回答