2017-10-21 123 views
0
public String getMetaData() { 
    String errors = ""; 
    try { 
     URL url = new URL("http://in2streaming.com:9999/stats?sid=1.xml"); 
     URLConnection conn = url.openConnection(); 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     // Error Here: 
     Document doc = db.parse(conn.getInputStream().toString()); 

     // get the root node 
     NodeList nodeList = doc.getElementsByTagName("SHOUTCASTSERVER"); 
     Node node=nodeList.item(0); 
     // the node has three child nodes 
     for (int i = 0; i < node.getChildNodes().getLength(); i++) { 
      Node temp=node.getChildNodes().item(i); 
      if(temp.getNodeName().equalsIgnoreCase("SONGTITLE")){ 
       return temp.getTextContent(); 
      } 
     } 
     return "Couldn't reach XML"; 
    } 
    catch (Exception e) { 
     return "Exception "; 
    } 
} 

L'appel de cette fonction via Runnable, Got exception android.os.NetworkOnMainThreadException je pourrais changer le lien pour http://in2streaming.com:9999/7.html et utiliser l'analyseur HTML au lieuErreur dans l'obtention XML et l'analyser

// Refresh meta data 
private final Runnable refresh_meta = new Runnable() { 
    @Override 
    public void run() { 
     Toast.makeText(m_context, getMetaData(), Toast.LENGTH_SHORT).show(); 
     m_handler.postDelayed(this, 5000); 
    } 
}; 
+0

Quelle est l'erreur? poster le logcat – pleft

+0

java.lang.NullPointerException: Tentative d'invocation de la méthode virtuelle 'void android.app.NotificationManager.createNotificationChannel (android.app.NotificationChannel)' sur une référence d'objet nul at cloud.SmoothRadio.nagare.MainJava.showNotification (MainJava .java: 60) à cloud.SmoothRadio.nagare.MainJava.onClick (MainJava.java:120) –

+0

Cette erreur n'appartient pas au code source affiché dans la question. – pleft

Répondre

2

Pour NetworkOnMainThreadException (Vous pouvez également utiliser AsyncTask):

Executors.newSingleThreadExecutor().submit(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(MainActivity.this, getMetaData(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

Si vous souhaitez programmer toutes les 5 secondes.

Vous pouvez utiliser ScheduledExecutorService

ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); 

     worker.scheduleAtFixedRate(refresh_meta, 
       1, //initial delay 
       5, //run every 5 seconds 
       TimeUnit.SECONDS); 

Et Mettez à jour votre Runnable comme

private Runnable refresh_meta = new Runnable() { 
     @Override 
     public void run() { 
      final String text = getMetaData(); 

      runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            Toast.makeText(m_context, text, Toast.LENGTH_SHORT).show(); 
           } 
          } 
      ); 


     } 
    }; 

En outre,

changement Document doc = db.parse(conn.getInputStream().toString()); à

Document doc = db.parse(conn.getInputStream()); 
+0

J'ai omis de mentionner que j'appelle cette fonction via Runnable –

+1

@mazenelzoor pouvez-vous également ajouter ce code à la question posté –

+0

@mazenelzoor J'ai utilisé ScheduledExecutorService au lieu de Handler.Update votre Runnable refresh_meta; et essayez d'essayer le code ci-dessus. –

1

D'abord quelques remarques:

a) ne pas moufles les exceptions comme vous le faites ici:

catch (Exception e) { 
    return "Exception "; 
} 

De cette façon, vous ne saurez jamais quelle était l'exception qui a été lancée. Il est préférable de se connecter/imprimer la trace de la pile de l'exception, par exemple:

catch (Exception e) { 
    Log.e("TAG", "Error", e); 
    return "Exception"; 
} 

b) conn.getInputStream().toString() ne fait pas ce que vous croyez qu'il ne (convertir le InputStream-String). DocumentBuilder La méthode parse prend un InputStream comme paramètre pas besoin de le convertir en String.

Avoir ce qui précède à l'esprit est ici votre méthode:

public String getMetaData() { 
    String errors = ""; 
    try { 
     URL url = new URL("http://in2streaming.com:9999/stats?sid=1.xml"); 
     URLConnection conn = url.openConnection(); 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     // Error Here: 
     Document doc = db.parse(conn.getInputStream()); 

     // get the root node 
     NodeList nodeList = doc.getElementsByTagName("SHOUTCASTSERVER"); 
     Node node=nodeList.item(0); 
     // the node has three child nodes 
     for (int i = 0; i < node.getChildNodes().getLength(); i++) { 
      Node temp=node.getChildNodes().item(i); 
      if(temp.getNodeName().equalsIgnoreCase("SONGTITLE")){ 
       return temp.getTextContent(); 
      } 
     } 
     return "Couldn't reach XML"; 
    } 
    catch (Exception e) { 
     Log.e("TAG", "Error in getMetaData()", e); 
     return "Exception "; 
    } 
} 

Essayez de lancer votre application à nouveau et si une erreur découle de cette méthode, il sera imprimé dans votre logcat avec le message « Erreur dans getMetaData() ". Mettez à jour votre question en conséquence avec l'erreur pour permettre aux autres membres de vous aider.