2013-05-19 5 views
0

Je construis une application de liste de liste android. Je veux qu'un message soit retourné quand un url est cliqué de la liste qui est dans un tableau indiquant à l'utilisateur si le site est en différé ou en ligne. Je le fais par un ping rapide qui renvoie une valeur booléenne pour le dire. Je suis un débutant java et je sais que c'est quelque chose à voir avec la façon dont j'appelle la méthode pinUrl() comme lorsque je supprime une instruction if de onListItemClick() l'application ne plante pas.Java Android: Appeler une méthode

Voici mon MainActivity pour référence:

package com.seven.webtools; 

import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

import android.annotation.SuppressLint; 
import android.app.ListActivity; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

@SuppressLint("UseValueOf") 
public class MainActivity extends ListActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Resources res = getResources(); 
    String[] Sites = res.getStringArray(R.array.Sites); 
    setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,Sites)); 

} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // Get the selected url 
    super.onListItemClick(l, v, position, id); 
    Object o = this.getListAdapter().getItem(position); 
    String address = o.toString(); 

    //Ping the address 
    String Status = "offline"; 
    if (MainActivity.pingUrl(address) == true){ 
     Status = "online"; 
    } 

    //Return the result 
    Toast.makeText(this, address + " is " + Status, Toast.LENGTH_LONG).show(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

public static boolean pingUrl(final String address) { 
    try { 
     final URL url = new URL("http://" + address); 
     final HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); 
     urlConn.setConnectTimeout(1000 * 10); // mTimeout is in seconds 
     final long startTime = System.currentTimeMillis(); 
     urlConn.connect(); 
     final long endTime = System.currentTimeMillis(); 
     if (urlConn.getResponseCode() == HttpURLConnection.HTTP_OK) { 
     System.out.println("Time (ms) : " + (endTime - startTime)); 
     System.out.println("Ping to "+address +" was success"); 
     return true; 
     } 
    } catch (final MalformedURLException e1) { 
     e1.printStackTrace(); 
    } catch (final IOException e) { 
     e.printStackTrace(); 
    } 
    return false; 
    } 

} 

Merci beaucoup si vous pouvez me aider :)

+0

hmmm ce qui est le problème? –

+0

Lorsque je clique sur l'un des éléments de la liste, le message "L'application a cessé de fonctionner" s'affiche. –

+0

Veuillez publier la trace de la pile à partir de logcat. Il montrera exactement quoi et où le problème est. – Simon

Répondre

0

Jetez un oeil à votre stack-trace, je pense que vous pourriez recevoir une NetworkOnMaintThreadException car vous effectuez la connexion HTTP sur le thread principal/interface utilisateur. Faites-le dans un fil séparé, peut-être en utilisant un AsyncTask, alors ça devrait aller.

+0

Je dois donc créer une nouvelle classe AsyncTask pour envoyer une requête ping à l'URL? –

+0

@gravysam Oui vous faites, vous pouvez vérifier cette réponse précédente que j'ai faite sur le même sujet: http://stackoverflow.com/questions/16572285/gson-and-google/16572315#16572315 –

0

Quelle version Android utilisez-vous? L'application peut se bloquer car vous effectuez un appel réseau sur l'UI-Main-Thread, ce qui signifie que l'interface utilisateur se fige pendant l'appel réseau. Dans les anciennes versions, cela fonctionne sans avoir d'exception. Depuis la version 2.3.x (corrigez-moi si je me trompe), vous obtenez le android.os.NetworkOnMainThreadException.

Jetez un oeil à cet article pour plus d'informations comment résoudre ce problème: - How to fix android.os.NetworkOnMainThreadException?

+0

J'utilise 4.2.2, donc je dois faire une nouvelle classe AsyncTask pour faire un ping sur l'url? –

+0

Oui, vous devez. Normalement, vous devriez voir l'exception dans votre stacktrace comme soren.qvist dans son message. – Woda

1

Vous devez utiliser soit un AsyncTask ou un Thread et Handler.

Voici un exemple d'un Thread et Handler:

public class MainActivity extends ListActivity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Resources res = getResources(); 
     String[] Sites = res.getStringArray(R.array.Sites); 
     setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,Sites)); 
    } 

    // Here is where we create our Handler that will receive the Message from the thread. 
    private Handler handler = new Handler() 
    { 
     @Override 
     public void handleMessage(Message msg) 
     { 
      StringBuilder str = new StringBuilder(); 
      str.append((String) msg.obj).append("\r\n"); 
      str.append("response: " + msg.arg1).append("\r\n"); 
      str.append("time: " + msg.arg2).append("\r\n"); 

      System.out.println(str.toString()); 
     } 
    }; 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) 
    { 
     super.onListItemClick(l, v, position, id); 

     final String address = l.getItemAtPosition(position).toString(); 

     // We create a new thread and implements the Runnable interface 
     new Thread(new Runnable() 
     { 
      public void run() 
      { 
       URL url; 
       HttpURLConnection connection = null; 

       try 
       { 
        url = new URL(address); 

        connection = (HttpURLConnection) url.openConnection(); 
        connection.setConnectTimeout(10 * 1000); 
        connection.setReadTimeout(10 * 1000); 

        long start = System.currentTimeMillis(); 

        connection.connect(); 

        int response = connection.getResponseCode(); 

        long end = System.currentTimeMillis(); 

        // Here we create a new Message to send to the Handler object on the Activity 
        // Send the response code, ping time, and the address 
        Message msg = Message.obtain(handler); 
        msg.arg1 = response; 
        msg.arg2 = (int) (end - start); 
        msg.obj = address; 
        msg.sendToTarget(); 
       } 
       catch(MalformedURLException e) 
       { 
        e.printStackTrace(); 
       } 
       catch(IOException e) 
       { 
        e.printStackTrace(); 
       } 
       finally 
       { 
        connection.disconnect(); 
       } 
      } 
     }).start(); 
    } 
} 
+0

Tout semble être exactement ce que je veux J'ai vérifié à plusieurs reprises mais je reçois toujours le message "L'application a cessé de fonctionner" quand un élément de la liste est cliqué:/des idées? –

+0

Afficher le suivi de pile, ou les 5 dernières lignes jusqu'à l'exception – mrres1