Android开发之网络操作(上)
2017-09-16 23:09
239 查看
注意以下操作你要添加两个权限
//获取网络链接状态 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> // 访问网络 <uses-permission android:name="android.permission.INTERNET"/>
检查网络连接状态
public void button1(View v) { ConnectivityManager cm=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info=cm.getActiveNetworkInfo(); if(info!=null) { if(info.isAvailable()) { Toast.makeText(getApplicationContext(), "网路可用!", 1000).show(); }else { Toast.makeText(getApplicationContext(), "当前网路不可用!", 1000).show(); } } }
检查是否为WIFI网络链接状态
public void button2(View v) { ConnectivityManager cm=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info=cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if(info!=null) { if(info.isAvailable()) { Toast.makeText(getApplicationContext(), "当前为是WIFI链接状态!", 1000).show(); }else { Toast.makeText(getApplicationContext(), "当前非WIFI链接状态!", 1000).show(); } }
检查是否为移动网络链接状态
public void button3(View v) { ConnectivityManager cm=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info=cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if(info!=null) { if(info.isAvailable()) { Toast.makeText(getApplicationContext(), "当前是移动网络链接状态!", 1000).show(); }else { Toast.makeText(getApplicationContext(), "当前不是移动网络链接状态!", 1000).show(); } } }
检查网络链接状态的类型
public void button4(View v) { ConnectivityManager cm=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info=cm.getActiveNetworkInfo(); if(info!=null) { if(info.isAvailable()) { int infoType=info.getType();//返回网络链接的类型 Toast.makeText(getApplicationContext(), "当前的网络链接类型为:"+infoType, 1000).show(); }else { Toast.makeText(getApplicationContext(), "当前网络不可用,无法获取网络的类型!", 1000).show(); } } }
URL介绍
显示网络的图片
package com.example.androidzhinet; import java.io.IOException; import java.io.InputStream; import java.lang.ref.WeakReference; import java.net.MalformedURLException; import java.net.URL; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { private ImageView iv; myHandler myhandler=new myHandler(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv=(ImageView) findViewById(R.id.iv1); } private static class myHandler extends Handler{ //通过软引用 private final WeakReference<MainActivity> weakReference; public myHandler(MainActivity activity) { weakReference=new WeakReference<MainActivity>(activity); } @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); MainActivity activity=weakReference.get(); if(activity!=null) { switch (msg.what) { case 100: activity.iv.setImageBitmap((Bitmap) msg.obj); break; } } } } //点击按钮显示网络上面的图片 public void showIV(View v) { new Thread(new Runnable() { @Override public void run() { try { URL url = new URL("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1505590054367&di=99b6e502c704f91ff3e8086aa72af29d&imgtype=0&src=http%3A%2F%2Ftupian.enterdesk.com%2F2013%2Fmxy%2F10%2F12%2F4%2F3.jpg"); 13b79 try { InputStream input=url.openStream(); Bitmap bitmap=BitmapFactory.decodeStream(input); Message msg=myhandler.obtainMessage(100,bitmap); myhandler.sendMessage(msg); } catch (IOException e) { e.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); } } }).start(); } }
原始的HttpUrlConnection访问方式:
package com.example.monilogin; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.net.URLEncoder; import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; // 访问网络<uses-permission android:name="android.permission.INTERNET"/> public class MainActivity extends Activity { private EditText edit1,edit2; private Button login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edit1=(EditText) findViewById(R.id.editText1); edit2=(EditText) findViewById(R.id.editText2); login=(Button) findViewById(R.id.login); } public void login(View v) { String name=edit1.getText().toString(); if(TextUtils.isEmpty(name)) { Toast.makeText(getApplicationContext(), "账号不能为空", 1000).show(); return; } String pwsss=edit2.getText().toString(); if(TextUtils.isEmpty(pwsss)) { Toast.makeText(getApplicationContext(), "密码不能为空", 1000).show(); return; } //启动工作线程 new Thread(new Runnable() { @Override public void run() { String path="你的服务器访问路径"; try { URL url=new URL(path); //打开http链接 HttpURLConnection con = null; try { con = (HttpURLConnection) url.openConnection(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { con.setRequestMethod("POST"); con.setDoInput(true); con.setDoOutput(true); con.setConnectTimeout(1000*30);//链接超时时间 con.setReadTimeout(1000*30);//读取数据的超时时间 con.setUseCaches(false); //设置请求的属性 con.setRequestProperty("Content-type","application/x-www-form-urlencoded"); //对服务器端读入于写入操作(使用输入输出流) //获取链接的输出流 try { DataOutputStream out=new DataOutputStream(con.getOutputStream()); out.writeBytes("username="+URLEncoder.encode("long","GBK")); out.writeBytes("&password="+URLEncoder.encode("123","GBK")); out.flush(); out.close(); //获取响应数据 BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream())); //返回json数据 String resule=br.readLine(); br.close(); con.disconnect();//关闭链接 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }
高级的Apache HttpClient访问方式
Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。一、简介
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。
下载地址: http://hc.apache.org/downloads.cgi
二、特性
基于标准、纯净的java语言。实现了Http1.0和Http1.1
以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
支持HTTPS协议。
通过Http代理建立透明的连接。
利用CONNECT方法通过Http代理建立隧道的https连接。
Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。
插件式的自定义认证方案。
便携可靠的套接字工厂使它更容易的使用第三方解决方案。
连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
自动处理Set-Cookie中的Cookie。
插件式的自定义Cookie策略。
Request的输出流可以避免流中内容直接缓冲到socket服务器。
Response的输入流可以有效的从socket服务器直接读取相应内容。
在http1.0和http1.1中利用KeepAlive保持持久连接。
直接获取服务器发送的response code和 headers。
设置连接超时的能力。
实验性的支持http1.1 response caching。
源代码基于Apache License 可免费获取。
三、使用方法
使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。
创建HttpClient对象。
创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
释放连接。无论执行方法是否成功,都必须释放连接
(1)HttpClientget之get请求
package com.example.monilogin; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; 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.util.EncodingUtils; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.Bundle; import android.view.View; public class ApacheHttpClient extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } //使用Apache HttpClient的get请求 public void getClick(View v) { new Thread(new Runnable() { @Override public void run() { String path="你的服务器访问路径?name=123&id=110"; //创建请求对象 HttpGet get=new HttpGet(path); //创建HTTP客户端对象,用于发送请求 HttpClient client=new DefaultHttpClient(); try { //向服务器发送请求,并返回相应对象 HttpResponse re=client.execute(get); //获取响应的状态码 int status=re.getStatusLine().getStatusCode(); switch (status) { case HttpStatus.SC_OK: System.out.println("200"); //返回HttpEntity实体对象 HttpEntity entity=re.getEntity(); //返回结果 String result=EntityUtils.toString(entity,"utf-8"); System.out.println(result); break; case HttpStatus.SC_NOT_FOUND: System.out.println("400"); break; case HttpStatus.SC_INTERNAL_SERVER_ERROR: System.out.println("服务器异常!"); break; } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }
(2)HttpClientget之post请求
package com.example.monilogin; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import org.apache.http.HttpEntity; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EncodingUtils; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.Bundle; import android.view.View; public class myHttpClientPost extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } //使用Apache HttpClient的post请求 public void posttClick(View v) { new Thread(new Runnable() { @Override public void run() { String path="你的服务器访问路径?name=123&id=110"; //创建请求对象 HttpPost post=new HttpPost(path); ArrayList<NameValuePair> params=new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("username","long")); params.add(new BasicNameValuePair("password","123")); HttpEntity entity = null; try { entity = new UrlEncodedFormEntity(params); post.setEntity(entity); HttpClient client=new DefaultHttpClient(); try { HttpResponse response=client.execute(post); switch (response.getStatusLine().getStatusCode()) { case HttpStatus.SC_OK: System.out.println("200"); //返回结果 String result=EntityUtils.toString(entity,"utf-8"); System.out.println(result); break; case HttpStatus.SC_NOT_FOUND: System.out.println("400"); break; case HttpStatus.SC_INTERNAL_SERVER_ERROR: System.out.println("服务器异常!"); break; } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }
Volley_简介
1. Volley简介
我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。
不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。
Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
Volley的Get请求和Post请求
package com.example.myvolley; import java.util.HashMap; import java.util.Map; import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.Response.Listener; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import android.app.Activity; import android.os.Bundle; import android.view.View; public class myVolleyGetAndPost extends Activity { RequestQueue queue=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建一个请求队列 queue=Volley.newRequestQueue(this); } //get方式 public void button1(View v) { String url="https://www.baidu.com/"; //发送一个字符串的请求(请求方式,URL,响应的回调接口,错误的回调接口); StringRequest request=new StringRequest(Request.Method.GET,url,new Listener<String>() { @Override public void onResponse(String response) { // TODO Auto-generated method stub System.out.println(response); } },new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub System.out.println(error); } }); //添加发送任务到队列 queue.add(request); } //post方式 public void button2(View v) { String url="你访问的服务器地址"; //发送一个字符串的请求(请求方式,URL,响应的回调接口,错误的回调接口); StringRequest request=new StringRequest(Request.Method.GET,url,new Listener<String>() { @Override public void onResponse(String response) { // TODO Auto-generated method stub System.out.println(response); } },new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub System.out.println(error); } }) { //实现一个回调方法 @Override protected Map<String, String> getParams() throws AuthFailureError { // TODO Auto-generated method stub Map<String, String> params=new HashMap<String, String>(); params.put("name","long"); return params; }}; //添加发送任务到队列 queue.add(request); } }
相关文章推荐
- Android开发之SD卡上文件操作(转载从网络)
- android开发之wifi网络操作初步
- mars老师[Android开发视频教学]01_23 WIFI网络操作
- WiFi 网络操作(一)-- MarsChen Android 开发教程学习笔记
- mars android开发之三:WIFI网络操作
- Android官方开发文档Training系列课程中文版:网络操作之网络连接
- Android开发中4个常用的工具类【Toast、SharedPreferences、网络及屏幕操作】
- Android开发视频教程之二十三(WiFi网络操作 一)
- Base-Android快速开发框架(四)--网络操作之FastJson以及AsyncHttpClient
- Android开发之WIFI网络操作
- Android官方开发文档Training系列课程中文版:网络操作之网络管理
- 单例模式,实现httpclient的封装,让android开发中,进行网络操作的时候更方便一点。
- Base-Android快速开发框架(五)--网络操作之RequestModel、ResponeModel、CustomAsyncHttpClient
- Android开发之WIFI网络操作
- Android官方开发文档Training系列课程中文版:网络操作之XML解析
- 单例模式,实现httpclient的封装,让android开发中,进行网络操作的时候更方便一点。
- Android开发之网络操作(下)
- Android开发之WIFI网络操作
- Android应用开发之(管理好你的网络操作)
- mars老师[Android开发视频教学]01_23 WIFI网络操作