Android开发之网络操作(上)

本文介绍了在Android中如何实现网络状态检测及不同类型的网络请求,包括GET和POST请求的实现方式,同时也展示了如何使用Apache HttpClient及Volley库来简化网络通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意以下操作你要添加两个权限

//获取网络链接状态
 <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介绍

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");
				
					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
二、特性

  1. 基于标准、纯净的java语言。实现了Http1.0和Http1.1

  2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

  3. 支持HTTPS协议。

  4. 通过Http代理建立透明的连接。

  5. 利用CONNECT方法通过Http代理建立隧道的https连接。

  6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。

  7. 插件式的自定义认证方案。

  8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。

  9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。

  10. 自动处理Set-Cookie中的Cookie。

  11. 插件式的自定义Cookie策略。

  12. Request的输出流可以避免流中内容直接缓冲到socket服务器。

  13. Response的输入流可以有效的从socket服务器直接读取相应内容。

  14. 在http1.0和http1.1中利用KeepAlive保持持久连接。

  15. 直接获取服务器发送的response code和 headers。

  16. 设置连接超时的能力。

  17. 实验性的支持http1.1 response caching。

  18. 源代码基于Apache License 可免费获取。
    三、使用方法

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

  1. 创建HttpClient对象。

  2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

  3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

  4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

  5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

  6. 释放连接。无论执行方法是否成功,都必须释放连接

(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);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王家视频教程图书馆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值