您的位置:首页 > 理论基础 > 计算机网络

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 网络操作