Android客户端判断服务器是否开启 HttpHostException解决方案
2017-04-17 16:45
330 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android判断服务器是否开启,试了很多方法都不行(若server未开启会卡在HttpResponse那),有人说高版本的Android程序不允许在主线程中访问网络(主线程中可以读写网络流)有待于验证。(更正:不是说的不允许访问,而是很耗时,会假死(不耗时则不会假死);正解:当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。)
方法一:
在xxxActivity的onCreate()方法中添加
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
这两句代码在我写的Activity中本来就添加着,这个方法没有解决我的问题,go on.....
solution 2:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
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对象,具体的获取方法请参考:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
if(new ConnServer().execute(AppConstant.BASE_URL).equals("success")){
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
。。。<pre name="code" class="java" style="font-size: 18px;">。。AppConstant.BASE_URL是一个http的字符串:如http://172.21.6.233:8080/
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
}
方法三:
refer:http://stackoverflow.com/questions/19162272/httpclient-executehttppost-on-android-4-2-error
Android判断服务器是否开启,试了很多方法都不行(若server未开启会卡在HttpResponse那),有人说高版本的Android程序不允许在主线程中访问网络(主线程中可以读写网络流)有待于验证。(更正:不是说的不允许访问,而是很耗时,会假死(不耗时则不会假死);正解:当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。)
方法一:
在xxxActivity的onCreate()方法中添加
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
这两句代码在我写的Activity中本来就添加着,这个方法没有解决我的问题,go on.....
solution 2:
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
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] viewplain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
if(new ConnServer().execute(AppConstant.BASE_URL).equals("success")){
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
。。。<pre name="code" class="java" style="font-size: 18px;">。。AppConstant.BASE_URL是一个http的字符串:如http://172.21.6.233:8080/
[java] view
plain copy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
}
方法三:
采用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
相关文章推荐
- Android客户端判断服务器是否开启 HttpHostException解决方案
- Android判断服务器是否开启
- Androidの网络Http之判断是否连接服务器
- Android的网络Http判断是否连接服务器
- Androidの网络Http之判断是否连接服务器
- Android判断服务器是否开启
- Android之网络Http之判断是否连接服务器
- android 判断service是否开启
- Android高手进阶教程(十八)之---列出Android设备中所有启动的服务,及判断某个服务是否开启!
- Android判断GPS是否开启和强制帮用户打开GPS
- socket怎么判断客户端与服务器是否断开
- Android高手进阶教程(十八)之---列出Android设备中所有启动的服务,及判断某个服务是否开启!
- delphi 判断SQL Server 服务器是否安装与开启
- Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程
- Android高手进阶教程(十八)之---列出Android设备中所有启动的服务,及判断某个服务是否开启!
- (转)列出Android设备中所有启动的服务,及判断某个服务是否开启!
- java-列出Android设备中所有启动的服务,及判断某个服务是否开启! - 随心
- Android高手进阶教程(十七)---列出Android设备中所有启动的服务,及判断某个服务是否开启!
- android 判断service是否开启
- Android(判断wifi是否开启,手机屏幕状态,sdcard是否被拔出,设置全屏)