尝试使用Android应用程序检查端口可用性

时间:2014-05-10 14:29:34

标签: java android network-programming inet

我正在尝试检查是否可以使用Android应用程序访问Web服务。

在我的按钮内单击侦听器:

    try {

            InetAddress address = InetAddress.getByName(result); // user input is 'result' (a URL) LINE 73
            boolean b = address.isReachable(3000); 
            String str = String.valueOf(b); // turning the value of the boolean into string
            pingResult.setText(str); // value displays as true or false

            }

    catch (UnknownHostException e) {} // will fill with helpful message later
    catch (IOException e) {}

Logcat显示:

05-10 15:21:21.390: E/AndroidRuntime(11653): FATAL EXCEPTION: main
05-10 15:21:21.390: E/AndroidRuntime(11653): Process: com.example.c3po, PID: 11653
05-10 15:21:21.390: E/AndroidRuntime(11653): android.os.NetworkOnMainThreadException
05-10 15:21:21.390: E/AndroidRuntime(11653):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
05-10 15:21:21.390: E/AndroidRuntime(11653):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
05-10 15:21:21.390: E/AndroidRuntime(11653):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
05-10 15:21:21.390: E/AndroidRuntime(11653):    at java.net.InetAddress.getByName(InetAddress.java:289)
05-10 15:21:21.390: E/AndroidRuntime(11653):    at com.example.c3po.MainActivity$2.onClick(MainActivity.java:73)

还有一些,第73行已被评论。

我出错的任何想法?

由于

2 个答案:

答案 0 :(得分:1)

您正在获取主线程异常的网络。在mainthread(即你的UI线程)上使用任何类型的阻塞(或网络活动)都不是一个好习惯。

可能的解决方案:

1.单击您的按钮,弹出一个线程,在该线程中执行您尝试执行的网络活动。() 2.此解决方案不可取。但是,您仍然可以设置清单以允许主线程上的网络活动,Google可以为您提供清单命令。

您可以在NetworkOnMainThreadException上谷歌了解更多信息。

答案 1 :(得分:1)

堆栈跟踪告诉您确切的错误,您正在UI线程上运行网络操作。只需将其移动到Thread或AsyncTask即可。