A. android 中怎么写好网络请求框架
Android程序最重要的模块就是网络部分,如何从网络上下载数据,如何将处理过的数据上传至网络,往往是android程序的关键环节。
Android原生提供基于HttpClient和HttpUrlConnection的两种网络访问方式。利用原生的这两种方式编写网络代码,需要自己考虑很多,获取数据或许可以,但是如果要将手机本地数据上传至网络,根据不同的web端接口,需要组织不同的数据内容上传,给手机端造成了很大的工作量。
目前有几种快捷的网络开发开源框架,给我们提供了非常大的便利,他们应该是android网络处理部分开源框架的前三名。
1.https://github.com/loopj/android-async-http
loopj这款开源框架一直是我钟爱的网络框架,在我写过的相当多的程序中,一直使用该框架,以至于对这个框架产生了厌倦的情绪。
太详细的使用文档,太简单的使用方式,它就像是一门高级语言,定制好了所有的东西,你只需要拼凑一下就能够处理,所以你想定制更加细节的操作,只有自己动手,反而造成了一些不必要的麻烦。
loopj在前一段时间对https的支持并不好,如果要支持https,则需要费点功夫。
1.4几个版本的升级对前部分代码的承接性不够好,造成了我对这个框架的厌倦。
B. android post网络数据的请求
public static String HttpPostMethod(String get_url,
List<NameValuePair> params) {
String result = "";
HttpParams basicHttpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(basicHttpParams, 15 * 1000);
HttpConnectionParams.setSoTimeout(basicHttpParams, 15 * 1000);
HttpClient htc = new DefaultHttpClient(basicHttpParams);
HttpResponse httpResponse = null;
try {
HttpPost httpPost = new HttpPost(get_url);
// response = htc.execute(request);
// 设置httpPost请求参数
// 创建参数队列
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");//json
httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
// httpResponse = new DefaultHttpClient().execute(httpPost);
httpResponse = htc.execute(httpPost);
// System.out.println(httpResponse.getStatusLine().getStatusCode());
Log.d("zh1", get_url+" " + httpResponse.getStatusLine().getStatusCode());
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 第三步,使用getEntity方法活得返回结果
result = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
if(result==null||result.equals("")){
return null;
}
}else{
return null;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
result = null;
} catch (IOException e) {
e.printStackTrace();
result = null;
}
return result;
}
C. android如何访问本地网络
如果你是打算用手机测试移动版网页的话(同局域网手机访问pc上的html)。
那可以将局域网内的设备都设置成静态ip。然后使用iis或php环境将网页放到站点目录下。
然后就可以通过ip进行访问了。
如果你打算用手机访问手机上的html页面
那你可以安装一个AndroPHP 然后将html页面放到站点目录下。然后使用给定的ip访问即可
参考内容如下:
Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面介绍四种常用网络请求方式,我这边是通过Android单元测试来完成这四种方法的,还不清楚Android的单元测试的同学们请看Android开发技巧总结中的Android单元测试的步骤一文。
java.net包中的HttpURLConnection类
Get方式:
// Get方式请求
public static void requestByGet() throws Exception {
String path = "https://reg.163.com/logins.jsp?id=helloworld&pwd=android";
// 新建一个URL对象
URL url = new URL(path);
// 打开一个HttpURLConnection连接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
// 设置连接超时时间
urlConn.setConnectTimeout(5 * 1000);
// 开始连接
urlConn.connect();
// 判断请求是否成功
if (urlConn.getResponseCode() == HTTP_200) {
// 获取返回的数据
byte[] data = readStream(urlConn.getInputStream());
Log.i(TAG_GET, "Get方式请求成功,返回数据如下:");
Log.i(TAG_GET, new String(data, "UTF-8"));
} else {
Log.i(TAG_GET, "Get方式请求失败");
}
// 关闭连接
urlConn.disconnect();
}
Post方式:
// Post方式请求
public static void requestByPost() throws Throwable {
String path = "https://reg.163.com/logins.jsp";
// 请求的参数转换为byte数组
String params = "id=" + URLEncoder.encode("helloworld", "UTF-8")
+ "&pwd=" + URLEncoder.encode("android", "UTF-8");
byte[] postData = params.getBytes();
// 新建一个URL对象
URL url = new URL(path);
// 打开一个HttpURLConnection连接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
// 设置连接超时时间
urlConn.setConnectTimeout(5 * 1000);
// Post请求必须设置允许输出
urlConn.setDoOutput(true);
// Post请求不能使用缓存
urlConn.setUseCaches(false);
// 设置为Post请求
urlConn.setRequestMethod("POST");
urlConn.setInstanceFollowRedirects(true);
// 配置请求Content-Type
urlConn.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
// 开始连接
urlConn.connect();
// 发送请求参数
DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
dos.write(postData);
dos.flush();
dos.close();
// 判断请求是否成功
if (urlConn.getResponseCode() == HTTP_200) {
// 获取返回的数据
byte[] data = readStream(urlConn.getInputStream());
Log.i(TAG_POST, "Post请求方式成功,返回数据如下:");
Log.i(TAG_POST, new String(data, "UTF-8"));
} else {
Log.i(TAG_POST, "Post方式请求失败");
}
}
org.apache.http包中的HttpGet和HttpPost类
Get方式:
// HttpGet方式请求
public static void requestByHttpGet() throws Exception {
String path = "https://reg.163.com/logins.jsp?id=helloworld&pwd=android";
// 新建HttpGet对象
HttpGet httpGet = new HttpGet(path);
// 获取HttpClient对象
HttpClient httpClient = new DefaultHttpClient();
// 获取HttpResponse实例
HttpResponse httpResp = httpClient.execute(httpGet);
// 判断是够请求成功
if (httpResp.getStatusLine().getStatusCode() == HTTP_200) {
// 获取返回的数据
String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
Log.i(TAG_HTTPGET, "HttpGet方式请求成功,返回数据如下:");
Log.i(TAG_HTTPGET, result);
} else {
Log.i(TAG_HTTPGET, "HttpGet方式请求失败");
}
}
Post方式:
// HttpPost方式请求
public static void requestByHttpPost() throws Exception {
String path = "https://reg.163.com/logins.jsp";
// 新建HttpPost对象
HttpPost httpPost = new HttpPost(path);
// Post参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "helloworld"));
params.add(new BasicNameValuePair("pwd", "android"));
// 设置字符集
HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
// 设置参数实体
httpPost.setEntity(entity);
// 获取HttpClient对象
HttpClient httpClient = new DefaultHttpClient();
// 获取HttpResponse实例
HttpResponse httpResp = httpClient.execute(httpPost);
// 判断是够请求成功
if (httpResp.getStatusLine().getStatusCode() == HTTP_200) {
// 获取返回的数据
String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
Log.i(TAG_HTTPGET, "HttpPost方式请求成功,返回数据如下:");
Log.i(TAG_HTTPGET, result);
} else {
Log.i(TAG_HTTPGET, "HttpPost方式请求失败");
}
}
以上是一些部分代码,测试的时候在测试类中运行对应的测试方法即可。
E. Android用到的几种网络请求方式
HttpURLConnection书写时比较繁琐,但运行效率较高 ;
HttpClient书写变的容易,并且便于理解,运行效率不如HttpURLConnection。
F. 如何在Android开发中用HttpClient连接网络数据
在Android的project的文件清单配置好网络权限;
找一个可用的接口url;
下面贴个代码,主要是这几步:
//用HttpClient发送请求,分为五步
//第一步:创建HttpClient对象
HttpClienthttpCient=newDefaultHttpClient();
//第二步:创建代表请求的对象,参数是访问的服务器地址
HttpGethttpGet=newHttpGet("http://www..com");
try{
//第三步:执行请求,获取服务器发还的相应对象
HttpResponsehttpResponse=httpCient.execute(httpGet);
//第四步:检查相应的状态是否正常:检查状态码的值是200表示正常
if(httpResponse.getStatusLine().getStatusCode()==200){
//第五步:从相应对象当中取出数据,放到entity当中
HttpEntityentity=httpResponse.getEntity();
Stringresponse=EntityUtils.toString(entity,"utf-8");//将entity当中的数据转换为字符串
}
这里要注意,如果在安卓里面记得用子线程进行网络请求!
G. android 开发.怎么访问移动网络
APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务)、CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。 APN的英文全称是Access Point Name,中文全称叫接入点,是您在通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络。 移动手机的默认上网配置有两种:CMWAP和CMNET。一些使用移动办公的大客户,通常会使用专用APN,其接入点随意定义,只要和该省运营商其他APN不冲突即可。 CMWAP也叫移动梦网,通过该接入点可接入一个比较大的移动私网,网内有大量的手机应用下载及资源访问。因为CMWAP不接入互联网,只接入移动运营商的私网,所以流量费用比较低廉。 CMNET也叫GPRS连接互联网,通常每个省的运营商会提供若干个Internet出口以供CMNET拨号用户使用。其流量费用较CMWAP要高一些。 目前国内销售的手机,如果是非智能机,通常已配置好CMWAP连接,智能机通常会配置CMWAP和CMNET连接。如需手动添加这些配置,请参考手机说明书。 专有APN在功能上可以和Internet的VPN做类比,实际上他就是基于GPRS的VPN网络。 专有APN常见组网方式 1,运营商部署一条专线接入到企业的网络中,局端和企业端路由器之间采用私有IP进行连接。 2,局端互连路由器与GGSN采用GRE隧道连接。 专有APN的几个重要特点: 1,除非运营商分配一个Internet IP地址,否则计算机没有任何办法通过Internet访问该APN中的主机。 2,只有手机卡号在APN中的白名单之列,该手机才可以接入该APN。 3,企业客户可以建立一套RADIUS和DHCP服务器,GGSN向RADIUS服务器提供用户主叫号码,采用主叫号码和用户账号相结合的认证方式;用户通过认证后由DHCP服务器分配企业内部的静态IP地址。补充:该认证方式不一定适合于每个省的运营商,这取决于该省运营商的APN管理平台。 GPRS专网系统终端上网登录服务器平台的流程为: 1)用户发出GPRS登录请求,请求中包括由运营商为GPRS专网系统专门分配的专网APN; 2)根据请求中的APN,SGSN向DNS服务器发出查询请求,找到与企业服务器平台连接的GGSN,并将用户请求通过GTP隧道封装送给GGSN; 3)GGSN将用户认证信息(包括手机号码、用户账号、密码等)通过专线送至Radius进行认证; 4)Radius认证服务器看到手机号等认证信息,确认是合法用户发来的请求,向DHCP服务器请求分配用户地址; 5)Radius认证通过后,由Radius向GGSN发送携带用户地址的确认信息; 6)用户得到了IP地址,就可以携带数据包,对GPRS专网系统信息查询和业务处理平台进行访问。
H. Android网络操作的几种方法
第一种方式:使用HttpURLConnection进行联网操作
这个方法需要我们手动构建一个http请求包,发送到指定的服务器
get方式
设置URL
打开连接
设置请求方法为get
设置连接超时时间
设置读取超时时间
把当前的request发送到服务器端
等待服务器的响应(此处会阻塞)
获得响应码(并在响应码中做相应的操作),因为安卓子线程内不允许做UI更新的操作,所以需要转到主线程来做(通过安卓中的handler来将信息传递到主线程)
publicvoidgetPic(Viewv){
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
//首先要支出服务器的地址
URLurl=newURL("http://192.168.2.1/day10_NetworkServer/brushli.jpg");
//通过http连接
=(HttpURLConnection)url.openConnection();
//设置请求方式,并设置等待响应时间
httpurlConnection.setRequestMethod("GET");
httpurlConnection.setConnectTimeout(5000);
//把当前的request发送到服务器(安卓不允许在主线程内做耗时操作,如连接服务器)
httpurlConnection.connect();
//发送完连接后等待操作,这个是阻塞式方法,
intresponseCode=httpurlConnection.getResponseCode();
//根据得到的响应代码和response的信息作出相应的操作
if(responseCode==200){
//从服务器读取正确与否的信息
InputStreamis=httpurlConnection.getInputStream();
Filefile=newFile("/data/data/com.rgd.day10_network_3/files");
file.mkdir();
FileOutputStreamfos=newFileOutputStream(newFile("/data/data/com.rgd.day10_network_3/files/brushli.jpg"));
byte[]buffer=newbyte[1024];
intread;
while((read=is.read(buffer))!=-1){
fos.write(buffer,0,read);
}
//由于子线程不允许做UI更新操作,与要通过Handler进行和主线程的通信操作
Messagemsg=newMessage();
msg.what=1;
handler.sendMessage(msg);
fos.close();
is.close();
}
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();
}
Handlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
switch(msg.what){
case1:
Toast.makeText(MainActivity.this,"保存图片成功",Toast.LENGTH_LONG).show();
break;
case2:
Toast.makeText(MainActivity.this,"保存MP3成功",Toast.LENGTH_LONG).show();
break;
case3:
Toast.makeText(MainActivity.this,"保存视频成功",Toast.LENGTH_SHORT).show();
default:
break;
}
}
};
2.post方式
操作跟get差不多,除了post传递信息是通过正文传递的,而get是放在连接中的
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
//首先要支出服务器的地址
URLurl=newURL("http://192.168.106.1/day10_NetworkServer/servlet/loginInfo");
//通过http连接
=(HttpURLConnection)url.openConnection();
//设置请求方式,并设置等待响应时间
httpurlConnection.setRequestMethod("POST");
httpurlConnection.setConnectTimeout(5000);
Stringdata="username="+username+"&password="+password+"&email="+email+"&phonenumber="+phonenumber;
OutputStreamoutputStream=httpurlConnection.getOutputStream();
outputStream.write(data.getBytes());
//把当前的request发送到服务器(安卓不允许在主线程内做耗时操作,如连接服务器)
httpurlConnection.connect();
//发送完连接后等待操作,这个是阻塞式方法,
intresponseCode=httpurlConnection.getResponseCode();
//根据得到的响应代码和response的信息作出相应的操作
if(responseCode==200){
//从服务器读取正确与否的信息
InputStreamis=httpurlConnection.getInputStream();
byte[]buffer=newbyte[1024];
intread=is.read(buffer);
Stringresult=newString(buffer,0,read);
//由于子线程不允许做UI更新操作,与要通过Handler进行和主线程的通信操作
Messagemsg=newMessage();
msg.what=1;
handler.sendMessage(msg);
}else{
Messagemsg=newMessage();
msg.what=-1;
handler.sendMessage(msg);
}
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();
I. Android如何获取网络连接状态及怎样调用网络配置界面
1. Android获取网络连接状态的代码如下:
public boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
2.转跳到网络设置界面:
Intent wifiSettingsIntent = new Intent("android.settings.WIFI_SETTINGS");
startActivity(wifiSettingsIntent);