2016-05-04 8 views
0

Ich versuche, ein Auto-Update-Programm für mein ROM zu erstellen. Also, ich arbeite an das Lesen von XML-Werten von einer URL, aber wenn ich es ausführen, zeigt die Aktivität nichts. Da ich ziemlich neu in Android-Codierung bin, beschreiben Sie bitte deutlich.Android Keine Elemente mit

Code:

package com.defyworks.defyupdater; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 

import java.net.URL; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

public class XMLParse extends AppCompatActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     /** Create a new layout to display the view */ 
     LinearLayout layout = new LinearLayout(this); 
     layout.setOrientation(LinearLayout.HORIZONTAL); 

     /** Create a new textview array to display the results */ 
     TextView UpdateName[]; 
     TextView Version[]; 
     TextView download[]; 

     try { 

      URL url = new URL("https://www.defyworks.com/DefyROM/update.xml"); 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document doc = db.parse(new InputSource(url.openStream())); 
      doc.getDocumentElement().normalize(); 

      NodeList nodeList = doc.getElementsByTagName("item"); 

      /** Assign textview array lenght by arraylist size */ 
      UpdateName = new TextView[nodeList.getLength()]; 
      Version = new TextView[nodeList.getLength()]; 
      download = new TextView[nodeList.getLength()]; 

      for (int i = 0; i < nodeList.getLength(); i++) { 

       Node node = nodeList.item(i); 

       UpdateName[i] = new TextView(this); 
       Version[i] = new TextView(this); 
       download[i] = new TextView(this); 

       Element fstElmnt = (Element) node; 
       NodeList nameList = fstElmnt.getElementsByTagName("UpdateName"); 
       Element nameElement = (Element) nameList.item(0); 
       nameList = nameElement.getChildNodes(); 
       UpdateName[i].setText("Update Name : " + ((Node) nameList.item(0)).getNodeValue()); 

       NodeList websiteList = fstElmnt.getElementsByTagName("Version"); 
       Element websiteElement = (Element) websiteList.item(0); 
       websiteList = websiteElement.getChildNodes(); 
       Version[i].setText("Version : " + ((Node) websiteList.item(0)).getNodeValue()); 

       download[i].setText("URL : " + websiteElement.getAttribute("download")); 

       layout.addView(UpdateName[i]); 
       layout.addView(Version[i]); 
       layout.addView(download[i]); 
      } 
     } catch (Exception e) { 
      System.out.println("XML Pasing Excpetion : " + e); 
     } 

     /** Set the layout view to display */ 
     setContentView(layout); 

    } 
} 

Antwort

0

In der Tat erhalten Sie "NetworkOnMainThreadException". Wie bereits gepostet, sollten Sie einen neuen Thread öffnen, wahrscheinlich über AsyncTask. Das ist jedoch nicht alles. Ich habe Ihre input.xml Datei heruntergeladen, in den Ordner "Assets" gestellt und trotzdem gab es mehrere Probleme.

  1. Sie suchen nach "item", aber es gibt keine solche Sache in der XML. So änderte ich <version> Umbau zu sein <item>.
  2. Dann bekam ich NullPointerException, wie Sie für Version suchen, wo in der XML, wird der Tag nicht mit der Hauptstadt V
  3. schließlich für den Download-Link starten Sie so etwas wie die folgenden, gemäß verwenden sollten eigener Programmierstil:
NodeList downloadList = fstElmnt.getElementsByTagName("download"); 
    Element downloadElement = (Element) downloadList.item(0); 
    downloadList = downloadElement.getChildNodes(); 
    download[i].setText("URL : " + downloadList.item(0).getNodeValue());
+0

Also .. änderte ich die xml. Auch habe ich den letzten Schritt nicht ganz verstanden .. –

+0

Ich meine, um den Download-Link zu zeigen, sollten Sie den Code verwenden, den ich gepostet habe, anstatt Ihren eigenen Code. Was Sie tun sollten, um dies lokal zu testen, z. Ohne AsyncTask, ist es notwendig, das XML in den Ordner "Assets" zu bringen und statt "url.openStream()' '' getAssets(). open ("input.xml") '. Wenn Sie sicher sind, dass die Benutzeroberfläche ordnungsgemäß funktioniert, beheben Sie den Netzwerkcode – igorepst

0

Dies liegt daran, dass Sie Ausnahme erhalten und damit Ihre LinearLayout nicht enthält jedes Kind. Die Ausnahme besteht darin, dass Sie die URL im Hauptthread der App treffen, was nicht erlaubt ist. Überprüfen Sie Ihre Protokolle XML Pasing Excpetion muss irgendwo in Ihren Protokollen gedruckt werden.

Sie sollten AsyncTask oder einen anderen Mechanismus (der die Anforderung in einem anderen Thread sendet) für Ihre Aufgabe verwenden.

Verwandte Themen