您的位置:首页 > 理论基础 > 计算机网络

Android客户端判断服务器是否开启 HttpHostException解决方案

2017-04-17 16:45 330 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android判断服务器是否开启,试了很多方法都不行(若server未开启会卡在HttpResponse那),有人说高版本的Android程序不允许在主线程中访问网络(主线程中可以读写网络流)有待于验证。(更正:不是说的不允许访问,而是很耗时,会假死(不耗时则不会假死);正解:当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。)

方法一:

在xxxActivity的onCreate()方法中添加

[java] view
plain copy

 





StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();  

StrictMode.setThreadPolicy(policy);  

这两句代码在我写的Activity中本来就添加着,这个方法没有解决我的问题,go on.....

solution 2:

[java] view
plain copy

 





package siat.hpc.ngb.utils;  

  

import java.io.IOException;  

  

import org.apache.http.HttpResponse;  

import org.apache.http.client.ClientProtocolException;  

import org.apache.http.client.HttpClient;  

import org.apache.http.client.methods.HttpGet;  

import org.apache.http.impl.client.DefaultHttpClient;  

import org.apache.http.params.BasicHttpParams;  

import org.apache.http.params.HttpConnectionParams;  

import org.apache.http.params.HttpParams;  

  

import android.os.AsyncTask;  

import android.util.Log;  

  

public class ConnServer extends AsyncTask<String,String,String>{  

      

    /** 

     *  

     * 判断服务器是否开启 

     * @param  path   网络服务器地址 

     * @return  

     * 服务器开启 

     * 服务器未开启 

     */  

      

    @Override  

    protected String doInBackground(String... params) {  

        // TODO Auto-generated method stub  

          

          

        try {  

            HttpGet get = new HttpGet(params[0]);  

Log.i("doInBack1...",params[0]);  

            HttpResponse response = new DefaultHttpClient().execute(get);  

              

Log.i("doInBack2...",params[0]);  

            if(response.getStatusLine().getStatusCode() == 200){  

                return "success";  

            }   

        } catch (ClientProtocolException e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

            return "ClientError";  

        } catch (IOException e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

            return "ServerError";  

        }  

        return "success";  

    }  

}  

在需要的地方直接调用:

下面这个直接调用获取不了String类型的返回值,返回的是一个Object对象,具体的获取方法请参考:


android两种方式获取AsyncTask返回值 这个文章

[java] view
plain copy

 





if(new ConnServer().execute(AppConstant.BASE_URL).equals("success")){   

[java] view
plain copy

 





。。。<pre name="code" class="java" style="font-size: 18px;">。。AppConstant.BASE_URL是一个http的字符串:如http://172.21.6.233:8080/  



[java] view
plain copy

 





}  

方法三:
采用Http方式:

复制代码
public boolean isConnByHttp(){
boolean isConn = false;
URL url;
HttpURLConnection conn = null;
try {
url = new URL("ttp://wl.daishu001.com/YHDriver.asmx");
conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(1000*5);
if(conn.getResponseCode()==200){
isConn = true;
}

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
conn.disconnect();
}
return isConn;
}


refer:http://stackoverflow.com/questions/19162272/httpclient-executehttppost-on-android-4-2-error
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: