Android网络操作的几种方法
安卓开发软件:AndroidStudio
服务器软件:Myeclipse+Tomcat
首先无论是哪种方式,安卓手机软件要想联网,必须要申请联网权限(android.permission.INTERNET)。
安卓主线程不允许做耗时操作(联网操作就是一种耗时操作),所以下面的的网络操作都是通过内部匿名类另起的一个线程操作的。
一,第一种方式:使用HttpURLConnection进行联网操作
这个方法需要我们手动构建一个http请求包,发送到指定的服务器
- get方式
- 设置URL
- 打开连接
- 设置请求方法为get
- 设置连接超时时间
- 设置读取超时时间
- 把当前的request发送到服务器端
- 等待服务器的响应(此处会阻塞)
- 获得响应码(并在响应码中做相应的操作),因为安卓子线程内不允许做UI更新的操作,所以需要转到主线程来做(通过安卓中的handler来将信息传递到主线程)
public void getPic(View v){
new Thread(new Runnable() {
@Override
public void run() {
try {
//首先要支出服务器的地址
URL url=new URL("http://192.168.2.1/day10_NetworkServer/brushli.jpg");
//通过http连接
HttpURLConnection httpurlConnection = (HttpURLConnection) url.openConnection();
//设置请求方式,并设置等待响应时间
httpurlConnection.setRequestMethod("GET");
httpurlConnection.setConnectTimeout(5000);
//把当前的request发送到服务器(安卓不允许在主线程内做耗时操作,如连接服务器)
httpurlConnection.connect();
//发送完连接后等待操作,这个是阻塞式方法,
int responseCode = httpurlConnection.getResponseCode(); //根据得到的响应代码和response的信息作出相应的操作
if(responseCode==200){
//从服务器读取正确与否的信息
InputStream is=httpurlConnection.getInputStream();
File file=new File("/data/data/com.rgd.day10_network_3/files");
file.mkdir();
FileOutputStream fos=new FileOutputStream(new File("/data/data/com.rgd.day10_network_3/files/brushli.jpg"));
byte[] buffer=new byte[1024];
int read;
while ((read =is.read(buffer))!=-1){
fos.write(buffer,0,read);
}
//由于子线程不允许做UI更新操作,与要通过Handler进行和主线程的通信操作 Message msg=new Message();
msg.what=1;
handler.sendMessage(msg);
fos.close();
is.close(); }
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}).start(); }
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case 1:
Toast.makeText(MainActivity.this, "保存图片成功", Toast.LENGTH_LONG).show();
break;
case 2:
Toast.makeText(MainActivity.this,"保存MP3成功",Toast.LENGTH_LONG).show();
break;
case 3:
Toast.makeText(MainActivity.this,"保存视频成功",Toast.LENGTH_SHORT).show();
default:
break;
}
}
};
2.post方式
- 操作跟get差不多,除了post传递信息是通过正文传递的,而get是放在连接中的
new Thread(new Runnable() {
@Override
public void run() {
try {
//首先要支出服务器的地址
URL url=new URL("http://192.168.106.1/day10_NetworkServer/servlet/loginInfo");
//通过http连接
HttpURLConnection httpurlConnection = (HttpURLConnection) url.openConnection();
//设置请求方式,并设置等待响应时间
httpurlConnection.setRequestMethod("POST");
httpurlConnection.setConnectTimeout(5000); String data="username="+username+"&password="+password+"&email="+email+"&phonenumber="+phonenumber;
OutputStream outputStream = httpurlConnection.getOutputStream();
outputStream.write(data.getBytes());
//把当前的request发送到服务器(安卓不允许在主线程内做耗时操作,如连接服务器)
httpurlConnection.connect();
//发送完连接后等待操作,这个是阻塞式方法,
int responseCode = httpurlConnection.getResponseCode(); //根据得到的响应代码和response的信息作出相应的操作
if(responseCode==200){
//从服务器读取正确与否的信息
InputStream is=httpurlConnection.getInputStream();
byte[] buffer=new byte[1024];
int read = is.read(buffer);
String result=new String(buffer,0,read);
//由于子线程不允许做UI更新操作,与要通过Handler进行和主线程的通信操作
Message msg=new Message();
msg.what=1;
handler.sendMessage(msg); }else{
Message msg=new Message();
msg.what=-1;
handler.sendMessage(msg);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} }
}).start();
3.通过
Android网络操作的几种方法的更多相关文章
- Android网络连接的两种方法:apache client和httpurlconnection的比较
另见http://blog.csdn.net/mingli198611/article/details/8766585 在官方blog中,android工程师谈到了如何去选择apache client ...
- Android 抗锯齿的两种方法
Android 抗锯齿的两种方法 (其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true)) 在Android中,目前,我知道有两种出现锯齿 ...
- android emulator启动的两种方法详解
android emulator启动的两种方法详解 转https://blog.csdn.net/TTS_Kevin/article/details/7452237 对于android学习者,模 ...
- PHP实现链式操作的三种方法详解
这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具 ...
- android 实现分享功能两种方法
当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.ex ...
- android——网络操作(一)连接网络
连接网络 一,包含许可 <uses-permissionandroid:name="android.permission.INTERNET"/> <uses-pe ...
- Android更新UI的几种方法
在Android开发过程中,常需要更新界面的UI.比如网络请求操作.一些耗时操作都不能放在UI线程中运行的,需要放在子线程,而子线程又不能更新UI界面,这是我们需要引入一个Handler,消息处理机制 ...
- Android数据存储的五种方法汇总
本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 ...
- Android数据存储的5种方法
--使用SharedPreferences存储数据 --文件存储数据 --SQLite数据库存储数据 --使用ContentProvider存储数据 --网络存储数据 Preference,File, ...
随机推荐
- .replace(R.id.container, new User()).commit();/The method replace(int, Fragment) in the type FragmentTransaction is not app
提示错误:The method replace(int, Fragment) in the type FragmentTransaction is not applicable for the arg ...
- 利用mysql-proxy进行mysql数据库的读写分离
实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 mysql-proxy-0 ...
- linux vsftpd 配置
linux 使用vsftpd 实现ftp上传 安装 vsftpd yum install -y vsftpd 配置vsftpd 备份配置文件后 将/etc/vsftpd/vsftpd.conf内容替换 ...
- Java连接SQLServer2008终极解决办法(亲身上机演练版)
今天我一学妹问我,Java连接SQLServer2008数据库的问题,一直无法连接成功.想起自己刚开始学习的时候,在网上找各种文章,然后实际上机验证操作,花了一两天时间才搞定,一把辛酸泪呀!记得当时是 ...
- 理解浮动和position定位
前言 为了更好理解浮动和position,建议先看看我写的这篇文章<Html文档流和文档对象模型DOM理解> 正文 一.浮动 CSS设计float属性的主要目的,是为了实现文本绕排图片的效 ...
- 【2016-11-2】【坚持学习】【Day17】【通过反射自动将datareader转为实体info】
通过ADO.net 查询到数据库的数据后,通过DataReader转为对象Info public class BaseInfo { /// <summary> /// 填充实体 /// & ...
- 修改VMware虚拟机里面的显卡名称
修改VMware虚拟机里面的显卡名称 现在有些蛋疼坑爹的游戏,会检测显卡的名称,如果其中有“Vmware”这类的字眼,就会提示程序在虚拟机中运行而拒绝执行(太不科学了嘛,我要是把我的实机驱动名称也改成 ...
- STL 堆
洛谷P3378 [模板]堆 #include <iostream> #include <cstdio> #include <algorithm> #include ...
- 洛谷P1288 取数游戏II[博弈论]
题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...
- HTML 学习笔记 JavaScript (Math和Number对象)
标签: Math对象:数学对象,提供对数据的数学计算.如:获取绝对值,向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. Number对象:Js中提供的数字的对象.包含整数,浮点数等等.并提 ...