Java XML解析给我一个错误,然后使应用程序崩溃
我正在创建一个简单的登录页面,它将响应REST服务给出的响应。如果以XML形式返回响应,并通过浏览器检查该服务是否正常工作,则返回响应 每次我点击登录按钮,应用程序强制关闭,我已经调试了它,但仍然无法理解它 startLogin已更改为AsyncTask 在主活动中,我在按钮单击侦听器上调用startLogin 公共类MainActivity扩展了活动{Java XML解析给我一个错误,然后使应用程序崩溃,java,android,xml,xml-parsing,Java,Android,Xml,Xml Parsing,我正在创建一个简单的登录页面,它将响应REST服务给出的响应。如果以XML形式返回响应,并通过浏览器检查该服务是否正常工作,则返回响应 每次我点击登录按钮,应用程序强制关闭,我已经调试了它,但仍然无法理解它 startLogin已更改为AsyncTask 在主活动中,我在按钮单击侦听器上调用startLogin 公共类MainActivity扩展了活动{ @Override protected void onCreate(Bundle savedInstanceState) { supe
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.loginButton).setOnClickListener(
new OnClickListener(){
public void onClick(View view){
new startLogin().execute("");
}
});
}
下面是我创建的异步任务
private class startLogin extends AsyncTask<String, Void, String> {
final EditText User= (EditText) findViewById(R.id.usernameEditText);
final EditText Pass= (EditText) findViewById(R.id.passwordEditText);
final TextView testLabel = (TextView) findViewById(R.id.testLabel);
@Override
protected String doInBackground(String... params) {
String finished= "have finished the login task.";
int z = 0;
String username = User.getText().toString();
String password = Pass.getText().toString();
String getOne = "http://demo.relocationmw.com/ws_docmgmt/mobile.asmx/GetLogin?userName=";
String getTwo = "&passWord=";
String URL = getOne + username + getTwo + password;
String KEY_ITEM = "Response";
String KEY_SUCCESS = "Success";
String KEY_FAIL = "Fail";
String KEY_UID = "UID";
testLabel.setText("Success to Async");
String xml = getXMLFromUrl(URL);
Document doc = getDomElement(xml);
if(xml != null)
{
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
Element e = (Element) nl.item(z);
String successString = getValue(e,KEY_SUCCESS);
String UIDString = getValue(e,KEY_UID);
String failString = getValue(e,KEY_FAIL);
String loginError = "Please check username and password.";
if(failString.equals("Fail")){
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(MainActivity.this, loginError, duration);
toast.setGravity(Gravity.TOP|Gravity.RIGHT, 0, 0);
toast.show();
}
else{
if(successString.equals("Success")){
Intent intent = new Intent (MainActivity.this, HomeActivity.class);
startActivity(intent);
}
}
}else
{
Toast toast = Toast.makeText(MainActivity.this, "No Connection to Retrieve Data.", Toast.LENGTH_LONG);
toast.show();
}
return finished;
}
@Override
protected void onPostExecute(String result) {
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
//XML Parsing Start
public String getXMLFromUrl(String url){
String xml = null;
try{
DefaultHttpClient client = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = client.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
// Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// Auto-generated catch block
e.printStackTrace();
}
return xml;
}
public Document getDomElement(String xml){
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
} catch (ParserConfigurationException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (SAXException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (IOException e) {
Log.e("Error: ", e.getMessage());
return null;
}
// return DOM
return doc;
}
public String getValue(Element item, String str) {
NodeList n = ((Document) item).getElementsByTagName(str);
return getElementValue(n.item(0));
}
public final String getElementValue( Node elem ) {
Node child;
if( elem != null){
if (elem.hasChildNodes()){
for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
if( child.getNodeType() == Node.TEXT_NODE ){
return child.getNodeValue();
}
}
}
}
return "";
}
//XML Parsing Stop
}
}
我现在能够将问题缩小到异步活动。
非常感谢您的帮助!让我们将getXMLFromUrl()方法放在一个新线程中(例如:AsyncTask)。我还没有读过您的代码,但是堆栈跟踪包括
没有与主机名相关联的地址
尝试将构建的URL放入浏览器、wget或任何您喜欢的内容中,并查看请求是否确实返回了某些内容。当您可以看到预期的结果时,请将其编入代码中。此外,请确保您的代码发出了相同的请求。class TestAsyncTask扩展了AsyncTask{
@Override
protected String doInBackground(String... params) {
return getXMLFromUrl(params[0]);
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
....
}
}
私有类startogin扩展异步任务{
@Override
protected String doInBackground(String... params) {
return getXMLFromUrl(params[0]);
}
@Override protected void onPostExecute(String result) {
if(result != null) {
String xml = result;
Document doc = getDomElement(xml);
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
Element e = (Element) nl.item(z);
String successString = getValue(e,KEY_SUCCESS);
String UIDString = getValue(e,KEY_UID);
String failString = getValue(e,KEY_FAIL);
String loginError = "Please check username and password.";
if(failString.equals("Fail")){
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(MainActivity.this, loginError, duration);
toast.setGravity(Gravity.TOP|Gravity.RIGHT, 0, 0);
toast.show();
}
else{
if(successString.equals("Success")){
Intent intent = new Intent (MainActivity.this, HomeActivity.class);
startActivity(intent);
}
}
}else
{
Toast toast = Toast.makeText(MainActivity.this, "No Connection to Retrieve Data.", Toast.LENGTH_LONG);
toast.show();
}
}
}
//调用异步任务
new startogin().execute(URL);您可以发布您的logcat输出吗?您是否尝试在调试器中遍历您的代码?顺便说一下,字符串不应该进行比较。请使用.equals()
请添加XML或日志,否则可能会有太多错误,我们会给您错误的建议更新。感谢所有人的帮助!“给我一个错误”,完全没有关于错误是什么的信息、错误消息或任何其他相关详细信息,并用“请找出问题所在"此处不是一个可回答的问题。此处的问题需要具体,并包含代码的相关部分。请编辑您的问题以提供有关错误本身的更多信息,并删除所有不必要的代码。希望我们猜测错误可能是什么以及它可能在代码的哪一部分完全是不考虑的e、 特别是当你请求免费帮助时。你能再强调一点吗?是的,在我的代码和浏览器中我都测试过。代码使应用程序崩溃,浏览器返回我需要的XML。一个是“失败”,另一个是“成功”我更新了代码,你现在可以看一下,让我知道这是否更好。它仍然强制关闭应用程序。我的代码看起来有点不同,但做的事情完全相同。我取出getXMLFromURL并在后台任务中运行它,在onPostExecute中移动所有UI元素更改和函数。
@Override
protected String doInBackground(String... params) {
return getXMLFromUrl(params[0]);
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
....
}
}
@Override
protected String doInBackground(String... params) {
return getXMLFromUrl(params[0]);
}
@Override protected void onPostExecute(String result) {
if(result != null) {
String xml = result;
Document doc = getDomElement(xml);
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
Element e = (Element) nl.item(z);
String successString = getValue(e,KEY_SUCCESS);
String UIDString = getValue(e,KEY_UID);
String failString = getValue(e,KEY_FAIL);
String loginError = "Please check username and password.";
if(failString.equals("Fail")){
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(MainActivity.this, loginError, duration);
toast.setGravity(Gravity.TOP|Gravity.RIGHT, 0, 0);
toast.show();
}
else{
if(successString.equals("Success")){
Intent intent = new Intent (MainActivity.this, HomeActivity.class);
startActivity(intent);
}
}
}else
{
Toast toast = Toast.makeText(MainActivity.this, "No Connection to Retrieve Data.", Toast.LENGTH_LONG);
toast.show();
}
}