2016-08-15 114 views
2

我在解析来自URL的XML时遇到了问题。我创建一个天气应用程序,我想从http://api.openweathermap.org/解析XML。我用这个AsyncTask,它不工作。这是我的代码,谢谢你的回复。只有ProgressDialog正在显示,不再显示。我也有清单中的互联网许可。Android XML解析AsyncTask

Weather.java

public class Weather extends AsyncTask<String[],Void,String[]> { 

private MainActivity activity; 
private XmlPullParserFactory factoryObj; 
private String url; 
private ProgressDialog pDialog; 


public Weather(MainActivity activity, String url) { 
    this.activity = activity; 
    this.url = url; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    pDialog = new ProgressDialog(activity); 
    pDialog.setMessage("Loading..."); 
    pDialog.setTitle("Please wait"); 
    pDialog.show(); 
} 

@Override 
protected String[] doInBackground(String[]... params) { 

    try{ 

     URL myurl = new URL(url); 
     HttpURLConnection connection = (HttpURLConnection) myurl.openConnection(); 
     connection.setReadTimeout(10000 /* milliseconds */); 
     connection.setConnectTimeout(15000 /* milliseconds */); 
     connection.setRequestMethod("GET"); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream stream = connection.getInputStream(); 


     factoryObj = XmlPullParserFactory.newInstance(); 
     XmlPullParser parser = factoryObj.newPullParser(); 

     parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES,false); 
     parser.setInput(stream,null); 
     String[] result = parseXML(parser); 
     stream.close(); 
     return result; 
    }catch(Exception e) 
    { 
     e.printStackTrace(); 
     return null; 
    } 
} 

public String[] parseXML(XmlPullParser parser) throws IOException,XmlPullParserException{ 


    int event; 
    String text=null; 
    String[] result =new String[1]; 


    event = parser.getEventType(); 

    while(event != XmlPullParser.END_DOCUMENT){ 
     String name = parser.getName(); 

     switch(event){ 

      case XmlPullParser.START_TAG: 
       break; 
      case XmlPullParser.TEXT: 
       break; 
      case XmlPullParser.END_TAG: 
       if(name.equals("temperature")) 
        result[0] = parser.getAttributeValue(null,"value"); 
       break; 

     } 
     parser.next(); 


    } 

    return result; 
} 


@Override 
protected void onPostExecute(String[] result) { 
    super.onPostExecute(result); 
    pDialog.dismiss(); 
    activity.callBackData(result); 
} 
} 

和MainActivity.java:

public class MainActivity extends Activity { 


TextView temp; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    temp = (TextView) findViewById(R.id.temptextView); 


    String url ="http://api.openweathermap.org/data/2.5/weather?q=warsaw&mode=xml&appid=35fae97674d2f8032b66a35addf05450"; 
    new Weather(this,url).execute(); 

} 


public void callBackData(String[] result) { 
    temp.setText(result[0]); 

} 
} 
+0

这是抛出异常吗? – Lino

+0

不,应用从不停止。 – Mateusz

回答

0

请从END_TAG移动代码START_TAG

case XmlPullParser.START_TAG: 
    if(name.equals("temperature")) 
     result[0] = parser.getAttributeValue(null,"value"); 
    break; 

这是因为 “温度” 不有明确的结束标记

+0

这是一个XML文件,我想付民标签是显式 这里是从XML的代码块: <温度值=“292.08”分钟=“289.82”最大值=“295.93”单元=“开尔文” /> <湿度值=“64”单位=“%”/> <压力值=“3”单位=“hPa”/> – Mateusz

+0

明确表示它没有。无论如何,我的建议是否有效? – Lino

+0

PL if(name.equals(“country”)) result [0] = parser.getText(); 没有工作:( – Mateusz

0

@Lino你是对的!我将END_TAG更改为START_TAG,一切正常!谢谢