android开发--android-async-http

做了个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效果如下:

async
(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值