2013-05-19 3 views
0

Я создаю приложение Android для просмотра списка. Я хочу, чтобы сообщение было возвращено при щелчке по URL-адресу из списка, который находится в массиве, указывающем пользователю, если сайт находится в автономном режиме или в Интернете. Я делаю это быстрым пингом, который возвращает значение Boolean, чтобы сказать это. Я новичок в java, и я знаю, что это связано с тем, как я вызываю метод pinUrl(), когда я удаляю указанный оператор if из onListItemClick(), приложение не вызывает сбоев.Java Android: вызов метода

Вот мой MainActivity для справки:

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; 
    } 

} 

Большое спасибо, если вы можете помочь мне :)

+0

хммм, Что проблема? –

+0

Когда я нажимаю один из элементов списка, я получаю сообщение «Приложение перестало работать». –

+0

Просьба отправить трассировку стека из логарифма. Он точно покажет, что и где проблема. – Simon

ответ

0

Взгляните на ваш стек-следа, я думаю, вы можете быть получение NetworkOnMaintThreadException, потому что вы выполняете HTTP-соединение в потоке Main/UI. Сделайте это в отдельном потоке, возможно, используя AsyncTask, тогда все будет в порядке.

+0

Итак, я должен создать новый класс AsyncTask для ping-кода? –

+0

@gravysam Да, вы можете проверить этот предыдущий ответ, который я сделал по той же теме: http://stackoverflow.com/questions/16572285/gson-and-google/16572315#16572315 –

0

Какую версию Android вы используете? Приложение может потерпеть крах, потому что вы выполняете сетевой вызов в интерфейсе UI-Main-Thread, что означает, что пользовательский интерфейс зависает во время сетевого вызова. В старых версиях он работает без исключения. Начиная с версии 2.3.x (исправьте меня, если я ошибаюсь) вы получите android.os.NetworkOnMainThreadException.

Взгляните на этот пост для получения дополнительной информации, как решить эту проблему: - How to fix android.os.NetworkOnMainThreadException?

+0

Я использую 4.2.2, поэтому я должен создать новый класс AsyncTask для ping-кода? –

+0

Да, вам нужно. Обычно вы должны увидеть исключение в своей stacktrace, как указано в его сообщении soren.qvist. – Woda

1

Вы должны использовать либо AsyncTask или Thread и Handler.

Вот пример Thread и 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

Что все выглядит так, как я хочу, я проверил его несколько раз, но я все равно получаю сообщение «Приложение перестало работать» при нажатии элемента списка:/любые идеи? –

+0

Опубликовать трассировку стека, или последние 5 строк до исключения – mrres1

Смежные вопросы