首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HttpGet Android API的随机行为

HttpGet Android API的随机行为
EN

Stack Overflow用户
提问于 2012-03-16 16:36:52
回答 1查看 419关注 0票数 1

我正在尝试使用HttpGet实现ping,但行为是随机的。

我有以下代码来测试互联网/服务器连通性:

代码语言:javascript
运行
复制
boolean result = false;
HttpGet request = new HttpGet("www.MyServer.com");
HttpParams httpParameters = new BasicHttpParams();
HttpClient httpClient = new DefaultHttpClient(httpParameters);

try
{
    HttpConnectionParams.setConnectionTimeout(httpParameters, 6000);
    HttpConnectionParams.setSoTimeout(httpParameters, 6000); 
    HttpResponse response = httpClient.execute(request);

    int status = response.getStatusLine().getStatusCode();

    if (status == HttpStatus.SC_OK) 
    {
        result = true;
    }

}
catch(Exception e)
{
    e.printStackTrace();
    result = false;
}

Log.d("App", "Ping Result:"+result);

上面的代码我在线程中运行,因为这可能需要时间。当我第一次运行这个测试时,我得到的结果是真的,但是在行为是随机的之后,有时它会给我错误‘主机无法到达’,我得到的结果是假的。

我只想测试服务器是否可以从当前配置的Android网络访问。

是否有可靠的API来测试互联网/服务器的连通性?

更新:

在服务中,我有以下启动测试的函数。

代码语言:javascript
运行
复制
void startTest()
{ 
    ServerTestThread mServerTestThread = new ServerTestThread()
    mServerTestThread.start();
}

class ServerTestThread extends Thread 
{
    boolean result = false;
    public void run() 
    {   
         //HttpGet code

                 //Send Message TO GUI Thread with result.
    }
}

上面的startTest函数是创建测试线程的实例并调用start函数。当测试完成后,我将向主线程发送包含结果的消息。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-16 16:55:28

您的代码没有任何问题。这意味着要么:

1)有时服务器真的无法访问

2)连接速度慢,到达服务器前超时。

因此,测试将超时设置为某个更大的值,例如60000(60sec),然后再次检查。如果它工作了,那么你就知道是因为超时了。

编辑

另外,请进行此更改,也许它会为我们提供更多信息:

代码语言:javascript
运行
复制
Log.d("App", "Status:" + status);
if (status == HttpStatus.SC_OK) 
{
    result = true;
}

EDIT2

代码语言:javascript
运行
复制
class ServerTestThread extends Thread 
{

    public static boolean result = false;
    public static HttpGet request = new HttpGet("www.MyServer.com");
    public static HttpParams httpParameters = new BasicHttpParams();
    public static HttpClient httpClient = new DefaultHttpClient(httpParameters);

    boolean result = false;
    public void run() 
    {   
         //HttpGet code

                 //Send Message TO GUI Thread with result.
    }

}

EDIT3

这将告诉您是否已连接到网络:

代码语言:javascript
运行
复制
boolean connected = false;
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || 
            connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
    //we are connected to a network
    connected = true;
}

警告:如果您连接到不包含internet访问或需要基于浏览器的身份验证的WiFi网络,connected仍将为true。

您将在清单中需要此权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9734098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档