2016-08-15 4 views
2

Ich habe ein Problem mit der Analyse von XML aus URL. Ich erstelle eine Wetter App und ich möchte Xml von http://api.openweathermap.org/ analysieren. Ich benutze für diese AsyncTask und es funktioniert nicht. Hier ist mein Code und danke für alle Antworten. Nur ProgressDialog wird angezeigt und nicht mehr. Auch ich habe Internet-Erlaubnis im Manifest.Android-XML-Analyse 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); 
} 
} 

und 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

ist das Werfen eine Ausnahme? – Lino

+0

Nein, die Anwendung stoppt nie. – Mateusz

Antwort

0

Bitte den Code aus END_TAG bewegen

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

start_tag dies, weil die "Temperatur" nicht ein explizites End-Tag haben

+0

dies ist eine XML-Datei, ich denke Ening Tag ist explict hier Stück Code von xml: Mateusz

+0

Explizit in dem Sinne, dass nicht vorhanden ist. Wie auch immer, funktioniert mein Vorschlag? – Lino

+0

PL if (name.equals ("Land")) Ergebnis [0] = parser.getText(); funktioniert nicht :( – Mateusz

0

@Lino du hattest Recht! Ich ändere END_TAG zu START_TAG und alles ist in Ordnung! Danke