android开发--android-async-http
来源:互联网 发布:手机淘宝 降价提醒 编辑:程序博客网 时间:2024/05/16 12:22
做了个demo,主要用android-async-http第三方库中AsyncHttpClient来实现对服务器上传(1)简单键值对数据,(2)json数据以及(3)文件资源.
一.android客户端
tip:需要往libs中导入android-async-http的jar包
下载 android-async-http jar 包
1.UI布局文件main_activity.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.min.myandroid_async_http.MainActivity" > <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="上传登录信息" android:textSize="16sp" > <requestFocus /> </TextView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <EditText android:id="@+id/et_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:ems="12" android:hint="登录名" > </EditText> <EditText android:id="@+id/et_pw" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:ems="12" android:hint="登录密码" /> </LinearLayout> <Button android:id="@+id/btn_upload_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="提交" /> <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="20dp" android:text="上传Json" android:textSize="16sp" > </TextView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <EditText android:id="@+id/et_sex" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:ems="12" android:hint="性别" > </EditText> <EditText android:id="@+id/et_age" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:ems="12" android:hint="年龄" /> </LinearLayout> <Button android:id="@+id/btn_upload_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="确定" /> <Button android:id="@+id/btn_upload_3" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="上传文件" /></LinearLayout>
UI效果如下:
(1)et_name,et_pw用来提交键值对数据,tv1显示btn_upload_1提交后获取服务器返回的数据信息
(2)et_sex,et_age用来输入数据(这些数据会封装成jsonobject),tv2显示btn_upload_2提交后获取服务器返回的数据信息
(3)btn_upload_3文件上传按钮
2.MainActivity.java代码:
package com.min.myandroid_async_http;import java.io.File;import java.io.FileNotFoundException;import org.apache.http.Header;import org.apache.http.protocol.HTTP;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.JsonHttpResponseHandler;import com.loopj.android.http.RequestParams;import com.loopj.android.http.TextHttpResponseHandler;public class MainActivity extends Activity { private Button btn_upload_1; private Button btn_upload_2; private Button btn_upload_3; private EditText et_name; private EditText et_pw; private EditText et_sex; private EditText et_age; private TextView tv1; private TextView tv2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化控件 init(); // 提交登录事件监听 btn_upload_1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { uploadData(); et_name.setText(""); et_pw.setText(""); // Toast.makeText(getApplicationContext(), "你click1", // Toast.LENGTH_SHORT).show(); } }); // 提交json数据监听 btn_upload_2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { uploadJson();// Toast.makeText(getApplicationContext(), "你click2",// Toast.LENGTH_SHORT).show(); } }); //上传文件监听 btn_upload_3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { uploadFile(); // Toast.makeText(getApplicationContext(), "你click3", // Toast.LENGTH_SHORT).show(); } }); } private void init() { tv1 = (TextView) findViewById(R.id.tv1); btn_upload_1 = (Button) findViewById(R.id.btn_upload_1); btn_upload_2 = (Button) findViewById(R.id.btn_upload_2); btn_upload_3 = (Button) findViewById(R.id.btn_upload_3); et_age = (EditText) findViewById(R.id.et_age); et_name = (EditText) findViewById(R.id.et_name); et_pw = (EditText) findViewById(R.id.et_pw); et_sex = (EditText) findViewById(R.id.et_sex); tv2 = (TextView) findViewById(R.id.tv2); } public void uploadData() { // 传递的参数设置 RequestParams requestParams = new RequestParams(); // 设置编码 requestParams.setContentEncoding(HTTP.UTF_8); requestParams.put("name", et_name.getText().toString()); requestParams.put("password", et_pw.getText().toString()); // 获取AsyncHttpClient对象 AsyncHttpClient client = new AsyncHttpClient(); String urladdress = "http://10.0.3.2:8080/MyServer/async"; client.post(urladdress, requestParams, new TextHttpResponseHandler( "UTF-8") { @Override // 当得到正确响应,以字符串形式返回 public void onSuccess(int arg0, Header[] arg1, String result) { tv1.setText(result); Log.i("result", result); } @Override // 当访问出错响应 public void onFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) { } }); } protected void uploadJson() { String urladdress = "http://10.0.3.2:8080/MyServer/asyncjson"; RequestParams requestParams = new RequestParams(); JSONObject jObject = new JSONObject(); try { jObject.put("set", et_sex.getText().toString()); jObject.put("age", et_age.getText().toString()); requestParams.setContentEncoding(HTTP.UTF_8); requestParams.put("info", jObject); AsyncHttpClient client = new AsyncHttpClient(); client.post(urladdress, requestParams, new JsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { tv2.setText(response.toString()); } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { super.onFailure(statusCode, headers, responseString, throwable); } }); } catch (JSONException e) { e.printStackTrace(); } } public void uploadFile() { String urladdress = "http://10.0.3.2:8080/MyServer/asyncfile"; RequestParams requestParams = new RequestParams(); requestParams.setContentEncoding(HTTP.UTF_8); File file = new File("/data/anr/traces.txt"); try { requestParams.put("myfile", file); AsyncHttpClient client = new AsyncHttpClient(); client.post(urladdress, requestParams, new TextHttpResponseHandler() { @Override public void onSuccess(int arg0, Header[] arg1, String result) { // TODO Auto-generated method stub System.out.println(result); Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show(); } @Override public void onFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) { // TODO Auto-generated method stub System.out.println("上传失败"); } }); } catch (FileNotFoundException e) { e.printStackTrace(); } }}
最后记得给予网络访问权限,在manifest.xml中,
<uses-permission android:name="android.permission.INTERNET"/>
二.servlet服务端编程:
用了3个servlet对应3中提交处理:
处理键值对参数:AsyncHttpClient.java(servlet):
package com.min.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class AsyncHttpClient extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out .println("--------------------async_get----------------------"); request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("-----------------async_post-------------"); request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); String pw = request.getParameter("password"); PrintWriter out = response.getWriter(); System.out.println("name="+name+"&&password="+pw); if (name.equals("jack") && pw.equals("12345")) { out.print("登录信息正确"); } else { out.print("登录信息有误"); } out.flush(); out.close(); }}
处理提交的json数据:AsyncJson.java(servlet):
需要导入json包到servlet的项目中
下载 json jar 包
package com.min.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.json.JSONException;import org.json.JSONObject;public class AsyncJson extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("------------------get_json--------------"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("--------------post_json------------"); request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); JSONObject jObject; try { jObject = new JSONObject(request.getParameter("info")); System.out.println(jObject.toString()); PrintWriter out = response.getWriter(); out.print(jObject); out.flush(); out.close(); } catch (JSONException e) { e.printStackTrace(); } }}
处理文件上传:AsyncFile.java(servlet):
这里用到了第三方jar,需要导入commons-fileupload和commons-io的jar包
下载 commons-fileupload jar 包
下载commons-io jar包
package com.min.servlet;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;public class AsyncFile extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("---------------get_file-------------"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); out.print("get请求"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("-------------post_file-----------"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); // 1、创建一个DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); // 配置好缓存区 // factory.setSizeThreshold(1024*1024*2); // File folder=new File("c:\\EFI"); // if(!folder.exists()){ // folder.mkdir(); // } // factory.setRepository(folder); // 2、创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); // 解决上传文件名的中文乱码 upload.setHeaderEncoding("UTF-8"); // 设置提交的最大文件类型数据的大小 upload.setSizeMax(1024 * 1024 * 20); // 设置提交的数据的大小 upload.setFileSizeMax(1024 * 1024 * 25); // 判断提交上来的数据是否是复杂类型数据的提交,如果是文件提交,则为复杂类型 if (!ServletFileUpload.isMultipartContent(request)) { // 按照传统方式获取数据 System.out.println("简单类型提交"); return; } else { // 处理文件提交 try { List<FileItem> lists = upload.parseRequest(request); if (lists != null) { for (FileItem item : lists) { //判断一个参数域是普通的表单输入域,还是文件上传域 if (item.isFormField()) { //上传的没有这类型的,不做处理// if(item.getName().equals("json")){// // } } else { // System.out.println(item.getName()); // System.out.println(item.getFieldName()); try { // 以文件形式存入到对应目录下 item.write(new File("D:\\" + item.getName())); out.write("文件上传成功"); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } } } } catch (FileUploadException e) { e.printStackTrace(); } } }}
tip:请配置好web.xml:
<servlet-mapping> <servlet-name>AsyncHttpClient</servlet-name> <url-pattern>/async</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AsyncJson</servlet-name> <url-pattern>/asyncjson</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AsyncFile</servlet-name> <url-pattern>/asyncfile</url-pattern> </servlet-mapping>
关于android客户端访问地址:用原生模拟器:10.0.2.2;genymotion模拟器为10.0.3.2
- android开发--android-async-http
- Android开发之Android-Async-Http
- Android快速开发Android-Async-Http
- android-async-http
- 关于android-async-http
- android-async-http
- android-async-http
- android-async-http
- android-async-http
- android-async-http
- android-async-http详解
- Android-Async-Http介绍
- Android之Async-http
- Android-Async-Http
- android-async-http框架
- Android-async-http 例子
- android-async-http使用
- android---(async-http)
- 为学习Hadoop使用VMware准备3台一模一样的Linux虚拟机的详细搭建过程
- 获取文件路径
- JS总结
- 100个直接可以拿来用的JavaScript实用功能代码片段
- 概率论与数量统计(二)3___ 第一章__概率,频率定义
- android开发--android-async-http
- 求最长公共序列长度-递归
- R基础知识
- 码农小汪-Hibernate学习9-hibernate双向关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable
- hdu2059龟兔赛跑
- 普通树转化成二叉树
- ES6-let带来了更简单的块级作用域
- 【01背包】Bone Collector
- 希尔排序