javaandroid:调用方法

javaandroid:调用方法,java,android,networking,methods,call,Java,Android,Networking,Methods,Call,我正在构建一个列表视图android应用程序。 我希望当从数组中的列表中单击url时返回一条消息,告诉用户站点是脱机还是联机。我通过一个快速ping来实现这一点,它返回一个布尔值来表示这一点。我是一个java新手,我知道这与我调用pinUrl()方法的方式有关,就像我从onListItemClick()中删除said if语句时,应用程序不会崩溃一样 以下是我的主要活动供参考: package com.seven.webtools; import java.io.IOException; im

我正在构建一个列表视图android应用程序。 我希望当从数组中的列表中单击url时返回一条消息,告诉用户站点是脱机还是联机。我通过一个快速ping来实现这一点,它返回一个布尔值来表示这一点。我是一个java新手,我知道这与我调用pinUrl()方法的方式有关,就像我从onListItemClick()中删除said if语句时,应用程序不会崩溃一样

以下是我的主要活动供参考:

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

}
package com.seven.webtools;
导入java.io.IOException;
导入java.net.HttpURLConnection;
导入java.net.MalformedURLException;
导入java.net.URL;
导入android.annotation.SuppressLint;
导入android.app.ListActivity;
导入android.content.res.Resources;
导入android.os.Bundle;
导入android.view.Menu;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.Toast;
@SuppressLint(“UseValueOf”)
公共类MainActivity扩展了ListActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Resources res=getResources();
String[]Sites=res.getStringArray(R.array.Sites);
setListAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,Sites));
}
@凌驾
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id){
//获取所选的url
super.onListItemClick(左、右、位置、id);
对象o=this.getListAdapter().getItem(位置);
字符串地址=o.toString();
//Ping地址
String Status=“脱机”;
if(MainActivity.pingUrl(地址)==true){
Status=“在线”;
}
//返回结果
Toast.makeText(这个地址+”是“+状态,Toast.LENGTH_LONG).show();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
公共静态布尔pingUrl(最终字符串地址){
试一试{
最终URL=新URL(“http://”+地址);
最终的HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
urlConn.setConnectTimeout(1000*10);//mTimeout以秒为单位
最终长启动时间=System.currentTimeMillis();
urlConn.connect();
最终长结束时间=System.currentTimeMillis();
if(urlConn.getResponseCode()==HttpURLConnection.HTTP\u确定){
System.out.println(“时间(毫秒):”+(endTime-startTime));
System.out.println(“Ping到“+地址+”即成功”);
返回true;
}
}捕获(最终畸形异常异常e1){
e1.printStackTrace();
}捕获(最终IOE例外){
e、 printStackTrace();
}
返回false;
}
}

非常感谢您的帮助:)

看看您的堆栈跟踪,我想您可能会得到一个
NetworkOnMaintThreadException
,因为您在主/UI线程上进行HTTP连接。在一个单独的线程中完成,也许可以使用一个,那么你应该很好。

你使用的是哪个Android版本?应用程序可能会崩溃,因为您正在UI主线程上进行网络调用,这意味着UI在网络调用期间冻结。在旧版本中,它可以正常工作,不会出现异常。从2.3.x版开始(如果我错了,请纠正我),您将获得
android.os.NetworkOnMainThreadException

有关如何解决此问题的更多信息,请参阅本文:
-

您应该使用
异步任务
线程
处理程序

下面是一个
线程
处理程序
的示例:

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();
    }
}
public类MainActivity扩展了ListActivity
{
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Resources res=getResources();
String[]Sites=res.getStringArray(R.array.Sites);
setListAdapter(新的ArrayAdapter(这个,android.R.layout.simple_list_item_1,Sites));
}
//这里是我们创建从线程接收消息的处理程序的地方。
私有处理程序=新处理程序()
{
@凌驾
公共无效handleMessage(消息消息消息)
{
StringBuilder str=新的StringBuilder();
str.append((字符串)msg.obj).append(“\r\n”);
str.append(“响应:+msg.arg1).append(\r\n”);
str.append(“时间:+msg.arg2).append(\r\n”);
System.out.println(str.toString());
}
};
@凌驾
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id)
{
super.onListItemClick(左、右、位置、id);
最终字符串地址=l.getItemAtPosition(position).toString();
//我们创建一个新线程并实现Runnable接口
新线程(newrunnable())
{
公开募捐
{
网址;
HttpURLConnection=null;
尝试
{
url=新的url(地址);
connection=(HttpURLConnection)url.openConnection();
连接。设置连接超时(10*1000);
connection.setReadTimeout(10*1000);
长启动=System.currentTimeMillis();
connection.connect();
int response=connection.getResponseCode();
long end=System.currentTimeMillis();
//这里,我们创建一条新消息,发送给活动上的处理程序对象
//发送响应代码、ping时间和地址
Message msg=Message.get(处理程序);
msg.arg1=响应;
msg.arg2=(int)