一、传输字符串数据

在Android中HttpURLConnection传输数据是必不可少的,我们继续在“AsyncTask(异步任务)”案例的基础上添加。

案例:

首先我们做一个jsp的服务端,文件名为test1.jsp。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><% String a = "1234567"; String lastId = request.getParameter("lastId");
if (lastId==null){
lastId = "0";
} int int_a = Integer.valueOf(a);
int int_lastId = Integer.valueOf(lastId); out.print(int_a + int_lastId);
%>

1、定义一个String类型的变量用来返回给客户端的字符串"1234567"。

2、通过客户端的lastId的参数值来判断是否请求。

3、通过out.print返回数据给客户端。

MainActivity.java文件:

public class MainActivity extends Activity {
private SimpleAdapter sa;
private Button btn;
private TextView tv;
private List<Userinfos> list=new ArrayList<Userinfos>(); private List<Map<String,Object> > messageList2 = new ArrayList<Map<String,Object> >();
private BaseAdapter adapter;
private ListView lv;
private Runnable doInBackground1;
private Runnable doInBackground2;
private Runnable doInBackground3;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
//这里是UI主线程
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //gdnf_class@126.com for (int i = 0; i < 5; i++) {
Userinfos u = new Userinfos();
u.setName("小明"+i);
u.setSex("男"+i);
list.add(u);
}
lv=(ListView)this.findViewById(R.id.listView1); tv=(TextView)findViewById(R.id.textView1);
btn=(Button)findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener(){ //模拟数据访问产生数据
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Take tk=new Take(MainActivity.this);//同步任务
tk.execute(list,adapter);//参数是传给doInBackground }});
adapter=new BaseAdapter(){ @Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
View vw; if(convertView==null)
{
Log.i("View","创建对象");
vw = inflater.inflate(R.layout.item, null); }
else
{
vw=convertView;
}
TextView tv_username = (TextView)vw.findViewById(R.id.username);
TextView tv_sex = (TextView)vw.findViewById(R.id.sex);
tv_username.setText(list.get(position).getName());
tv_sex.setText(list.get(position).getSex());
return vw; }}; lv.setAdapter(adapter); @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item); } }

通过 Button的点击事件,传参数是传给doInBackground,进入客户端的后台进行操作。

Take.java文件:

public class Take extends AsyncTask{
private MainActivity activity;
private BaseAdapter adapter;
private List<Userinfos> list=new ArrayList<Userinfos>();
private static final String URL_STR="http://android2017.duapp.com/test1.jsp";
private String errorMessage = "";
private String lastId = "5";
protected Take(MainActivity activity)
{
this.activity=activity;
}
//后台运行(数据库,蓝牙,互联网)
@Override
protected Object doInBackground(Object... params) { list = (List<Userinfos>) params[0];
adapter = (BaseAdapter) params[1];
try {
//发送数据
注释二URL ul = new URL(URL_STR);
HttpURLConnection http = (HttpURLConnection) ul.openConnection();
// 对连接进行配置
http.setDoInput(true);// 输入
http.setDoOutput(true);// 输出
http.setRequestMethod("POST");
// 防止读取脏数据
http.setUseCaches(false);
// 获取一个输出流
OutputStream os = http.getOutputStream();
// DataOutputStream数据输出流
DataOutputStream str = new DataOutputStream(os);
str.writeBytes("lastId=" + URLEncoder.encode(lastId, "UTF-8"));// 編碼
str.flush();// 刷新,将数据发到缓冲区。
str.close();if (http.getResponseCode() == 200) {
//读取数据
// 输入流
注释二InputStream inst = http.getInputStream();//
// reader(注意UTF-8读)
InputStreamReader isr = new InputStreamReader(inst, "UTF-8");
// 缓冲区,防止读死
BufferedReader br = new BufferedReader(isr);
String ReadOneline = null;
// 多行数据时,减少不断创建String对象
StringBuffer sb = new StringBuffer();
while ((ReadOneline = br.readLine()) != null) {
sb.append(ReadOneline);
}
inst.close();
isr.close();
br.close();
http.disconnect();
return sb.toString(); } else { errorMessage = "服务器繁忙,请稍后再试(" + http.getResponseCode() + ")";
return "errorserver"; }
} catch (Exception e) {
// TODO Auto-generated catch block
errorMessage = e.getMessage();
return "errorclient";
} }
//准备
@Override
protected void onPreExecute() {
Toast.makeText(activity, "今晚有约", Toast.LENGTH_SHORT).show();
super.onPreExecute();
}
//做完后执行
@Override
protected void onPostExecute(Object result) {
// result的值为doInBackground方法的返回值
String tr = result.toString();
Log.i("d",""+tr);
TextView tv = (TextView) activity.findViewById(R.id.textView1);
/* tv.setText("访问完成!"+tr); */
//空指针
if ("errorclient".equals(tr)) {
if (errorMessage.indexOf("No add") != -1) {
tv.setText("网络不通");
} else {
tv.setText("访问网络时其它异常:" + errorMessage);
} } else if ("errorserver".equals(tr)) {
tv.setText(errorMessage);
} else {
tv.setText(tr);
} }
//分步完成
//onProgressUpdate更新进度条
@Override
protected void onProgressUpdate(Object... values) {
// TODO Auto-generated method stub
Log.i("dd", "进入分步");
int bar = Integer.parseInt(values[0].toString());
bar = (bar + 1) * 20;
ProgressBar progressBar = (ProgressBar) activity
.findViewById(R.id.progressBar1);
progressBar.setProgress(bar);
adapter.notifyDataSetChanged();
// 这里是UI主线程
}
}

1、URL_STR是我们发布服务的地址。

2、我们通过地址加上参数lastid

3、通过HttpURLConnection等相关设置连接服务发起请求。

4、OutputStream等流来传递和读取数据(注:由于上一章详解过在这就不多说)

5、通过onPostExecute方法将读取到的数据赋值给textView1

二、下载图片:

互联网传递二进制流

我们添加一take2img的类同样继承于AsyncTask,进行相关的操作。

take2img.java文件:

    //下载图片
private MainActivity activity;
private BaseAdapter adapter;
private static final String URL_img_STR = "http://cms-bucket.nosdn.127.net/c476803813014a5fa865f22c0faa340320161208080029.jpeg";
private String errorMessage = "";
private Bitmap bitmap; protected Take2img(MainActivity activity)
{
this.activity=activity;
}
@Override
protected Object doInBackground(Object... params) {
try {
URL ul=new URL(URL_img_STR);
Log.i("d","dddddd2");
HttpURLConnection http = (HttpURLConnection)ul.openConnection();//创建连接对象
// 对连接对象进行配置
http.setDoInput(true);// 输入
http.setDoOutput(false);// 输出
http.setRequestMethod("GET");
if (http.getResponseCode() == 200) { InputStream inst=http.getInputStream();
bitmap= BitmapFactory.decodeStream(inst); inst.close();
http.disconnect();
return "ere";
} else { errorMessage = "服务器繁忙,请稍后再试(" + http.getResponseCode() + ")";
return "errorserver"; }
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
}
//做完后执行
@Override
protected void onPostExecute(Object result) {
// result的值为doInBackground方法的返回值
String tr = result.toString();
TextView tv = (TextView) activity.findViewById(R.id.textView1);
/* tv.setText("访问完成!"+tr); */
if ("errorclient".equals(tr)) {
if (errorMessage.indexOf("No add") != -1) {
tv.setText("网络不通");
} else {
tv.setText("访问网络时其它异常:" + errorMessage);
} } else if ("errorserver".equals(tr)) {
tv.setText(errorMessage);
} else {
tv.setText(tr);
ImageView img=(ImageView) activity.findViewById(R.id.imageView1);
img.setImageBitmap(bitmap);
} super.onPostExecute(result);
} }

1、URL_img_STR 网络图片路径。

2、由于是读取图片所以设置输出为false,GET请求。

3、通过HttpURLConnection等相关设置连接服务发起请求。

4、设置Bitmap变量缓存图片。

5、通过onPostExecute方法设置imageView1图片。

效果图:

三、传递集合(JSON格式)

首先我们将test1.jsp修改一下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.util.*,com.fasterxml.jackson.databind.*"%><% //解决中文问题,以及缓存问题
//http1.1浏览器
response.setHeader("Cache-Control", "no-cache");
//http1.0浏览器
response.setHeader("Prama", "no-cache");
//提醒过期1.0,1.1都支持
response.setDateHeader("Expires", 0);
//控制输出流
response.setCharacterEncoding("UTF-8");
//告之浏览器
response.setHeader("content-type","text/json;charset=UTF-8");
//保证获取过来的参数为UTF8,否则乱码
request.setCharacterEncoding("utf-8"); String a = "1234567"; String lastId = request.getParameter("lastId");
if (lastId==null){
lastId = "3";
}
int count = Integer.valueOf(lastId); class User { private String username;
private String sex;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
List<User> userList = new ArrayList<User>();
for(int i=0;i<count;i++){
User u = new User();
u.setUsername("明明"+i);
u.setSex("女"+i);
userList.add(u);
}
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(userList);
out.print(jsonStr);
/*
int int_a = Integer.valueOf(a);
int int_lastId = Integer.valueOf(lastId); out.print(int_a + int_lastId);
*/
%>

1、创建一个User类,添加了username,sex两个字段,通过List<user>对该类赋值添加数据。

2、设置了一个count变量通过 request.getParameter("lastId")方法获取客户端传递过来的lastId参数值。

3、同过map 的writeValueAsString方法转换成JSON格式。

4、通过out.print()方法返回给客户端。

take.java文件:

public class Take extends AsyncTask{
private MainActivity activity;
private BaseAdapter adapter;
private List<Userinfos> list=new ArrayList<Userinfos>();
private static final String URL_STR="http://android2017.duapp.com/test1.jsp";
private String errorMessage = "";
private String lastId = "5";
protected Take(MainActivity activity)
{
this.activity=activity;
}
//后台运行(数据库,蓝牙,互联网)
@Override
protected Object doInBackground(Object... params) { list = (List<Userinfos>) params[0];
adapter = (BaseAdapter) params[1];
try { URL ul = new URL(URL_STR);
HttpURLConnection http = (HttpURLConnection) ul.openConnection();
// 对连接进行配置
http.setDoInput(true);// 输入
http.setDoOutput(true);// 输出
http.setRequestMethod("POST");
// 防止读取脏数据
http.setUseCaches(false);
// 获取一个输出流,
OutputStream os = http.getOutputStream();
// DataOutputStream数据输出流
DataOutputStream str = new DataOutputStream(os);
str.writeBytes("lastId=" + URLEncoder.encode(lastId, "UTF-8"));// 編碼
str.flush();// 刷新,将数据发到缓冲区。
str.close(); if (http.getResponseCode() == 200) { Log.i("状态","200"); //读取数据
// 输入流
InputStream inst = http.getInputStream();
// reader(注意UTF-8读)
InputStreamReader isr = new InputStreamReader(inst, "UTF-8");
// 缓冲区,防止读死
BufferedReader br = new BufferedReader(isr);
String ReadOneline = null;
// 多行数据时,减少不断创建String对象
StringBuffer sb = new StringBuffer();
while ((ReadOneline = br.readLine()) != null) {
sb.append(ReadOneline);
} //读取JSON数据
list.clear();
JSONArray jso = new JSONArray(sb.toString());
for (int i = 0; i < jso.length(); i++) {
JSONObject jo = (JSONObject) jso.get(i);
Userinfos us=new Userinfos();
us.setName(jo.getString("username"));
us.setSex(jo.getString("sex") );
list.add(us);
} inst.close();
isr.close();
br.close();
http.disconnect();
return sb.toString(); } else { errorMessage = "服务器繁忙,请稍后再试(" + http.getResponseCode() + ")";
return "errorserver"; }
} catch (Exception e) {
// TODO Auto-generated catch block
errorMessage = e.getMessage();
return "errorclient";
} }
//做完后执行
@Override
protected void onPostExecute(Object result) {
// result的值为doInBackground方法的返回值
String tr = result.toString();
Log.i("d",""+tr);
TextView tv = (TextView) activity.findViewById(R.id.textView1);
/* tv.setText("访问完成!"+tr); */
//空指针
if ("errorclient".equals(tr)) {
if (errorMessage.indexOf("No add") != -1) {
tv.setText("网络不通");
} else {
tv.setText("访问网络时其它异常:" + errorMessage);
} } else if ("errorserver".equals(tr)) {
tv.setText(errorMessage);
} else {
tv.setText(tr);
adapter.notifyDataSetChanged();
} } }

1、URL_STR服务端网站地址。

2、通过HttpURLConnection等相关设置连接服务发起请求。

3、ReadOneline读取数据,JSONArray转换数据通过循环获取数据

4、通过 adapter.notifyDataSetChanged()通知进行更新操作。

效果图:

HttpURLConnection 传输数据和下载图片的更多相关文章

  1. 使用HttpURLConnection下载图片

    import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.Ht ...

  2. Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    Android中使用HttpURLConnection实现GET POST JSON数据与下载图片 Android6.0中把Apache HTTP Client全部的包与类都标记为deprecated ...

  3. 通过HttpURLConnection下载图片到本地--下载附件

    一.背景说明 现在我做的系统中,需要有一个下载附件的功能,其实就是下载图片到本地中.相应的图片保存在多媒体系统中,我们只能拿到它的资源地址(url),而不是真实的文件. 这里记录的是下载单个图片.下篇 ...

  4. 用java页面下载图片

    try { //根据String形式创建一个URL对象 String filePath = materialProductWorks.getDownloadImageUrl(); URL url = ...

  5. Java-->利用URL类下载图片

    --> 通过get 请求访问图片地址,将通过服务器响应的数据(即图片数据)存到本地文件中... --> HttpURLConnectionUtil 工具类 package com.drag ...

  6. android 多线程下载图片

    很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天Android123整理出两种比较好的方法来实现远程图片的下载.   方法一.直接通过Android提供的Http类访问远程服 ...

  7. Android异步下载图片并且缓存图片到本地

    Android异步下载图片并且缓存图片到本地 在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML ...

  8. Android开发之异步获取并下载网络资源-下载图片和下载文本内容

    在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图:              下载图片截图   ...

  9. android 73 下载图片

    package com.ithiema.imageviewer; import java.io.InputStream; import java.net.HttpURLConnection; impo ...

随机推荐

  1. Hadoop学习------Hadoop安装方式之(一):单机部署

    Hadoop 默认模式为单机(非分布式模式),无需进行其他配置即可运行.非分布式即单 Java 进程,方便进行调试. 1.创建用户 1.1创建hadoop用户组和用户 一般我们不会经常使用root用户 ...

  2. 未能加载文件或程序集“BLL”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。

    今天使用VS2012创建项目的时候,考虑到项目中代码的重用性以及清晰简洁性,搭建了一个三层架构,但是在项目运行的时候,总是报错: “未能加载文件或程序集“BLL”或它的某一个依赖项.生成此程序集的运行 ...

  3. dos脚本》大神

    关于dos命令行脚本编写 dos常用命令另查 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码也是共 ...

  4. python vtk 通过回调函数监测键盘”Up”键动作,每按一次方向上键,actor变换一种颜色

    import vtk class KeyPressInteractorStyle(vtk.vtkInteractorStyleTrackballCamera): def __init__(self,p ...

  5. R语言 一套内容 从入门 到放弃

    [怪毛匠子整理] 1.下载 wget http://mirror.bjtu.edu.cn/cran/src/base/R-3/R-3.0.1.tar.gz 2.解压: tar -zxvf R-3.0. ...

  6. Git学习笔记--命令

    git init--初始化Git仓库 git add <fils>--将文件添加到暂存区,可添加多个文件,空格隔开 git commit--提交到仓库 git status--查看工作区状 ...

  7. 前端自动化构建工具--Gulp&&Webpack

    前端构建工具的作用可以认为是对源项目文件或资源进行文件级处理,将文件或资源处理成需要的最佳输出结构和形式. 在处理过程中,我们可以对文件进行模块化引入.依赖分析.资源合并.压缩优化.文件嵌入.路径替换 ...

  8. ORACLE用户表空间使用情况查询

    1.查询用户使用的表空间: select username,default_tablespace,temporary_tablespace from dba_users where username ...

  9. vue day6 分页显示

    @{ ViewBag.Title = "Home Page"; Layout = null; } <!DOCTYPE html> <html> <he ...

  10. elipse使用,Java和Javaee模式区别

    Java带有用户界面的基本ide,缺少数据库和web开发工具 IDE(Integrated Development Environment,集成开发环境).集成开发环境(简称IDE)软件是用于程序开发 ...