android网络
❶ android 首选网络
如果你是2G的卡,不会利用3G网络,建议把无线控件里的“仅选择2G网络”勾上版,可以减少不必要的权搜网。
没错,2G搜不到3G信号,但它依然会联网搜索,然后连接GSM。
你还是仅选择WCDMA吧,android机对网络稳定性要求高,不稳定的情况下可能会有断线、重新搜网的情况
❷ android几种网络框架的比较
现在 OkHttp 已经来一统 android 的江山,自但是基于 OkHttp 再次封装的 框架层出不穷
推荐直接使用 OkHttp 的增强版本 OkHttps , 15秒便可上手,超级好用,这是官方中文文档地址:okhttps.ejlchina.com
❸ android怎么判断网络是否可用
/**
* 获取当前网络类型
*
* @return 0:没有网络 1:WIFI网络 2:WAP网络 3:NET网络
*/
public static int getNetworkType() {
int netType = 0;
ConnectivityManager connectivityManager = (ConnectivityManager) AppContext
.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo == null) {
return netType;
}
int nType = networkInfo.getType();
if (nType == ConnectivityManager.TYPE_MOBILE) {
String extraInfo = networkInfo.getExtraInfo();
if (!StringUtil.isEmpty(extraInfo)) {
if (extraInfo.toLowerCase().equals("cmnet")) {
netType = NETTYPE_CMNET;
} else {
netType = NETTYPE_CMWAP;
}
}
} else if (nType == ConnectivityManager.TYPE_WIFI) {
netType = NETTYPE_WIFI;
}
return netType;
}
❹ Android中网络通信的几种方式
主要有六种方式:
(1)针对TCP/IP的Socket、ServerSocket
(2)针对UDP的DatagramSocket、DatagramPackage。这里需要注意的是回,考虑到Android设备答通常是手持终端,IP都是随着上网进行分配的。不是固定的。因此开发也是有一点与普通互联网应用有所差异的。
(3)针对直接URL的HttpURLConnection。
(4)Google集成了Apache HTTP客户端,可使用HTTP进行网络编程。
(5)使用WebService。Android可以通过开源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去实现Webservice。
(6)直接使用WebView视图组件显示网页。基于WebView 进行开发,Google已经提供了一个基于chrome-lite的Web浏览器,直接就可以进行上网浏览网页。
❺ android底层网络框架是怎么实现的
一个好用的网络底层框架可以很大的程度上方便自己的项目,我们下面要做的就是一个趁手的网络框架。
做一个网络框架我们首先要确定这个网络框架除了能够从网络上获取数据还需要哪些功能:
首先抛弃AsyncTask,自定义一套网络底层的封装框架。
设计一套适合自己App的缓存策略
设计一套假数据返回的机制,在网络请求API没有返回的时候,可以假装获取到了网络返回的数据。
封装用户cookie的逻辑。
其他的还好,可能有人对于第一步的那个抛弃AsyncTask有些疑问,就是为什么要抛弃啊,这个类这个好用,内部封装了那么多的方法。但是我们不能只看到这个的优点,这个类有个致命的缺点:不能灵活的控制内部的线程池。
我们都知道的是,线程池里面的每个线程都是API的调用请求,而AsyncTask中有没有暴漏出取消这些请求的方法,这个时候,如果我们从A界面调到B界面,那么在A界面调用的API请求,如果还没有返回,并不会被取消,对于一个频繁调用API请求的APP应用应用来说,一个界面调用的API可能超过十个,在网络不好的情况下,如果这个时候跳转到了其他界面,这个时候其他界面也会调用API,这个时候造成的情况就是这个界面的请求并不会显示数据,因为首页的请求还在排队,要等首页的请求完成之后你才可以调用,这个就是所谓的AsyncTask堵塞。
我刚工作的时候遇到一个情况就是,根据公司的情况写了一个统计用户交互数据的SDK,开始的使用时候就是这个AsyncTask类,结构我发现在APP中某一个界面的吊起特别的慢,数据加载也非常的慢,发现的原因是我写的这个SDK中的API请求调用超时,并且在超时的时候重复调用三次这个API。
网络请求的格式
网络请求两个方法POST和GET,我们一般把GET方法为请求数据,POST为修改数据。请求的方法格式也是相对有讲究的。
Request
所有的MobileApi都可以写作:http://www.xxx.com/aaaa.api的形式。
GET:对于GET方法我们可以将请求API写作http://www.xxx.com/aaaa.api K1=va1&K2=va2,形式,也就是说,把key-value这样的键值对存放在URL上,这样做的话会方便我们后面对数据进行缓存,另外要精良是GET的参数都是String,int这样的类型,方便缓存,解析。
POST:我们都知道看不见POST的请求数据,一般key-value这样的键值对存放在Form表单中,最后进行提交请求。POST经常会提交大量数据,所以有些键值对要定义成集合或复杂的自定义实例,这个时候我们就需要把这样的值转换为JSON字符串进行提交,有APP传递到API后,在将JSON字符串转换为对于的实体。
Response
服务器现在用的最多的是使用JSON作为api返回的结果,这里也是使用JSON。
一般情况下返回的json数据中要有以下数据:
首先一个是否调用api成功的参数,
另外一个错误类型的参数(这个参数可以是Int格式的参数,成功为0)
错误具体信息的参数,成功为“”
具体API返回的结果,失败为“”
所以我们定义一个Response实体类,作为JSON实体的最外层。
如果成功返回了数据,数据会存放在result字符按中,映射为Response实体的result属性。
如果上面返回的result是一种实体的集合,那么就要把result解析为相应的实体集合。
我们在前面看到我们把AsyncTask抛弃重新写一个扩展性强的,可以随时取消API请求网络底层,那么我们的这个网络底层的线程池使用的是什么:使用原生的ThreadPoolExecutor + Runnable + Handler
首先我们要把App所调用的所有的API接口放到一个类或者xml文件中去,我们这里放在xml文件里面去,当然要写出读取xml的类和函数:
其中key和url的值符合key-value键值,expires代表数据缓存的时间单位为毫秒,netType代表请求方式(POST和GET) ,mockClass代表的是返回假数据的类。
RemoteService和RequestCallback和RequestParameter
这三个类表示的是请求的服务,请求返回,请求参数,三个给APP调用的类。
其他的两个类在方法中调用:
context:表示上下文
key:即xml文件中的key
RequestParameter:请求携带的参数
callback:请求回调
forceUpdate:是否强制更新数据,忽略缓存
RequestMannager类是一个集合类,用于取消请求的。每次发起请求时,都会把为此创建的Request添加到RequestManager中,即RequestManager中保存了全部的request。
他是对ThreadPoolExecutor和ArrayBlockingQueue的简单封装,是一个线程池,每发起一次请求,这个线程池就会分配一个新的线程来执行该请求。
HttpRequest类,发起HTTP请求的地方,他事先了Runable,从而让DefaultThreadPool可以分配新的线程,所以所有的请求逻辑都在Runnable接口方法里:
在这个类中对于get请求接口,他会把传递来的数据,处理为相应的格式:http://www.xxx.com/aaaa.api K1=va1&K2=va2。对于Post格式的请求接口,他会把传递过来的数据转换为BasicNameValuePair的形式,并放在表单中提交。
需要注意的是,因为我们把每个HttpRequest都放在了子线程中执行,所以RequestCallback的回调不能直接操作UI线程的控件,所以这个时候Handler就可以用到了。使用这个就可以保证RequestCallback的回调在UI线程上,不会报错。
❻ Android中如何简单检测网络是否连接
权限:
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
代码:
/*
*判断网络连接是否已开
*true已打开false未打开
**/
publicstaticbooleanisConn(Contextcontext){
booleanbisConnFlag=false;
ConnectivityManagerconManager=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfonetwork=conManager.getActiveNetworkInfo();
if(network!=null){
bisConnFlag=conManager.getActiveNetworkInfo().isAvailable();
}
returnbisConnFlag;
}
/*没有网络跳转到网络设置页面
*打开设置网络界面
**/
(finalContextcontext){
//提示对话框
AlertDialog.Builderbuilder=newAlertDialog.Builder(context);
builder.setTitle("网络设置提示").setMessage("网络连接不可用,是否进行设置?").setPositiveButton("设置",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//TODOAuto-generatedmethodstub
Intentintent=null;
//判断手机系统的版本即API大于10就是3.0或以上版本
if(Build.VERSION.SDK_INT>10){
intent=newIntent(Settings.ACTION_WIRELESS_SETTINGS);
}else{
intent=newIntent();
ComponentNamecomponent=newComponentName("com.android.settings","com.android.settings.WirelessSettings");
intent.setComponent(component);
intent.setAction("android.intent.action.VIEW");
}
context.startActivity(intent);
}
}).setNegativeButton("取消",newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
//TODOAuto-generatedmethodstub
dialog.dismiss();
}
}).show();
}
❼ 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();
❽ android 网络判断的几种方法
//判断是否有网络连接
(Contextcontext){
if(context!=null){
=(ConnectivityManager)context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfomNetworkInfo=mConnectivityManager.getActiveNetworkInfo();
if(mNetworkInfo!=null){
returnmNetworkInfo.isAvailable();
}
}
returnfalse;
}
//判断WIFI网络是否可用
(Contextcontext){
if(context!=null){
=(ConnectivityManager)context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfomWiFiNetworkInfo=mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if(mWiFiNetworkInfo!=null){
returnmWiFiNetworkInfo.isAvailable();
}
}
returnfalse;
}
//判断MOBILE网络是否可用
(Contextcontext){
if(context!=null){
=(ConnectivityManager)context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfomMobileNetworkInfo=mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if(mMobileNetworkInfo!=null){
returnmMobileNetworkInfo.isAvailable();
}
}
returnfalse;
}
//获取当前网络连接的类型信息
(Contextcontext){
if(context!=null){
=(ConnectivityManager)context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfomNetworkInfo=mConnectivityManager.getActiveNetworkInfo();
if(mNetworkInfo!=null&&mNetworkInfo.isAvailable()){
returnmNetworkInfo.getType();
}
}
return-1;
}
❾ android网络通信问题
打开拨号程序:
输入如下代码:*#*#4636#*#*
上面的图片中只输入了*#*#4636#*#,是为了截图方便,你要完整的输入*#*#4636#*#*,出来一个从没见过的界面。。。。
选择“手机信息”
出来“手机信息”界面,然后下拉到最后,选择标示的一栏,设置“首选网络类型”:
然后选持箭头所指的“WCDMA only”
OK,按返回键退出,设置完毕。
注意:如果你不是很懂,其它选项请勿随便更改,当手机无信号时,请更改为原设置。
❿ android 判断是否有网络
直接给你代码吧:
/**
*判断是否有网络连接专
*@paramcontext
*@return
*/
(Contextcontext){
属=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfomNetworkInfo=mConnectivityManager.getActiveNetworkInfo();
if(mNetworkInfo!=null&&mNetworkInfo.isAvailable()){ //判断网络连接是否打开
returnmNetworkInfo.isConnected();
}
returnfalse;
}