我不会寻求帮助,我总是做我的研究,并试图自己找到解决方案,但这次我真的被卡住了...... 我对一些语言有很多经验,但不是用java ... 所以,我要做的是一个具有动态布局的应用程序,并从特定主机上的XML文件加载它。 我的第一个问题是,显然,从主线程中读取XML是不可能的,所以我必须学习线程和Asynctaks,我决定使用一个简单的线程并将值存储在我创建的一些全局变量中,但它不起作用...... 我也尝试将SAX用于XML解析器,但我更喜欢DOM。 我只是试着做了3天以上,我对此变得有点生气,我希望有人可以帮助我,这是我的代码:
这是我定义我的vars的类。它们都应该处理多个值,除了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,如果可能的话,我希望将它们放在多层阵列上。
答案 0 :(得分:0)
我仍然认为缺少一些代码,但为了不让你陷入困境,这里有几件可能出错的事情:
et.setText(Info.XML);
可能会在你的线程完成之前执行,忽略“ErrNo”。我对此的说明:
INTERNET
权限),<appname>
未关闭和/或没有根元素。Info.ParamX
数组,这将导致NullPointerException
,Actions.getLength()
的大小,这可能会导致ArrayIndexOutOfBoundsException
或类似;换句话说,在Info.ParamX = new String[Actions.getLength()];
循环之前添加for
。System.out.println()
在catch子句中输出异常,并在LogCat 中检查它。 onCreate()
中,请将其放在那里。此外,还有一些小问题:
Thread
进行一次性应用是可以的,但您应该一般避免使用它,例如:将其替换为AsyncTask
(您已阅读过)。 PS。在ParamX
中,X
当然是1到6之间的每个整数。
答案 1 :(得分: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/
希望有所帮助