android-async-http开源框架可以是我们轻松的获取网络数据或者向服务器发送数据,使用起来也很简单,下面做简单介绍,具体详细使用看官网:https://github.com/loopj/android-async-http

 

原文地址:http://blog.csdn.net/zhaoyazhi2129/article/details/26983259

引用开源框架通过AsyncHttpClient处理get/post请求

一、引用开源框架方法。

方法一

找到下载文件的源码,Com包黏贴到项目中的src目录下

方法二

引入jar包到libs下

 

二、引用开源框架发送get请求给服务器步骤:

1.创建异步请求端对象

2.发送get请求,(get请求参数含义:请求的url地址;异步请求的handler)

3.在成功请求里(status:状态返回码,headers:头部请求信息,responseBody返回结果)设置控件内容

 

三、引用开源框架发送post请求给服务器步骤

1.创建异步请求端对象

2.发送post请求,(get请求参数含义:请求的url地址;异步请求的handler)

3.封装请求参数

4.在成功请求里(status:响应状态码,headers:响应头信息,responseBody相应内容的字节码)设置控件内容

补充:

查看帮助文档我们知道,在post方法中传递参数时候可以创建RequestParams的对象,put进你所想要赋的值。如下图:

实例解析:当用户登录时,在界面输出用户是否登录成功

运行结果

      

 

 

项目实现
1.布局文件:同login布局文件

http://blog.csdn.net/zhaoyazhi2129/article/details/26509763

2.在AndroidManifest.xml添加internet权限

3.LoginActivity的代码(代码中详细加了注释,请仔细阅读)

package com.example.android_httpasync;
 
import org.apache.http.Header;
 
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
 
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/**
 * 通过开源框架AsyncHttpClient的get/post请求处理
 * @author zhaoyazhi
 *
 */
public class MainActivity extends Activity {
  private EditText et_username;
  private EditText et_password;
 
  private TextView tv_result;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    findView();
  }
 
  /**
   * 查找控件
   */
  public void findView() {
    et_password = (EditText) findViewById(R.id.editpass);
    et_username = (EditText) findViewById(R.id.editusername);
    tv_result = (TextView) findViewById(R.id.tv_result);
  }
 
  /**
   * 登陆按钮操作
   * 
   * @param v
   */
  public void login(View v) {
    // 获取点击控件的id
    int id = v.getId();
    // 根据id进行判断
    switch (id) {
    case R.id.btn_login:// 进行登录操作
      // 获取用户名密码
      final String userName = et_username.getText().toString();
      final String userPass = et_password.getText().toString();
 
      // 判断是否为空
      if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPass)) {
        Toast.makeText(getApplicationContext(), "用户名或者密码不能为空", 0)
            .show();
      } else {
        Toast.makeText(getApplicationContext(), "发送请求道服务器", 0).show();
 
        // loginByAsyncHttpClientGet(userName, userPass);
 
        loginAsyncHttpClientPost(userName, userPass);
 
      }
      break;
 
    default:
      break;
    }
  }
 
  /**
   * 通过开源框架AsyncHttpClient的post请求处理
   * @param userName
   * @param userPass
   */
  private void loginAsyncHttpClientPost(final String userName,
      final String userPass) {
    // 发送请求到服务器
    AsyncHttpClient client = new AsyncHttpClient();
    String url = "http://172.16.237.144:8080/Login/LoginServlet";
    // 创建请求参数
    RequestParams params = new RequestParams();
    params.put("username", userName);
    params.put("userpass", userPass);
    // 执行post方法
    client.post(url, params, new AsyncHttpResponseHandler() {
 
      @Override
      public void onSuccess(int statusCode, Header[] headers,
          byte[] responseBody) {
        // 设置值
        tv_result.setText(new String(responseBody));
      }
 
      @Override
      public void onFailure(int statusCode, Header[] headers,
          byte[] responseBody, Throwable error) {
        // 打印错误信息
        error.printStackTrace();
 
      }
    });
  }
 
  /**
   * 通过开源框架AsyncHttpClient的get请求处理
   * @param userName
   * @param userPass
   */
  private void loginByAsyncHttpClientGet(final String userName,
      final String userPass) {
    // 创建异步请求端对象
    AsyncHttpClient client = new AsyncHttpClient();
 
    String url = "http://172.16.237.144:8080/Login/LoginServlet?username="
        + userName + "&userpass=" + userPass;
    // 发送get请求对象
    client.get(url, new AsyncHttpResponseHandler() {
      @Override
      // statusCode:状态返回码,headers:头部请求信息,responseBody返回结果
      public void onSuccess(int statusCode, Header[] headers,
          byte[] responseBody) {
        tv_result.setText(new String(responseBody));
      }
 
      @Override
      public void onFailure(int statusCode, Header[] headers,
          byte[] responseBody, Throwable error) {
        // 输出错误信息
        error.printStackTrace();
      }
    });
  }
}

为了加强我们理解,在onSuccess方法中加入一些测试语句:

在控制台输出结果如下:

 

 

 

jar文件资源:http://download.csdn.net/detail/zhaoyazhi2129/7400787
源码:http://download.csdn.net/detail/zhaoyazhi2129/7400799

 

 

http://blog.csdn.net/redarmy_chen/article/details/26980613

package com.example.lesson03;  
 
import org.apache.http.Header;  
 
import com.loopj.android.http.AsyncHttpClient;  
import com.loopj.android.http.AsyncHttpResponseHandler;  
import com.loopj.android.http.RequestParams;  
 
import android.app.Activity;  
import android.os.Bundle;  
import android.text.TextUtils;  
import android.view.View;  
import android.widget.EditText;  
import android.widget.TextView;  
import android.widget.Toast;  
 
public class LoginActivity extends Activity {  
 
    // 声明控件  
    private EditText et_name, et_pass;  
    private TextView tv_result;  
 
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
 
        // 获取控件对象  
        et_name = (EditText) findViewById(R.id.et_name);  
        et_pass = (EditText) findViewById(R.id.et_pass);  
        tv_result = (TextView) findViewById(R.id.tv_result);  
    }  
 
    /** 
     * 点击按钮控件触发的事件 
     * @param v 
     */  
    public void login(View v) {  
        //获取控件的id  
        int id = v.getId();  
        //根据id判断进行相应的处理  
        switch (id) {  
        case R.id.btn_login:  
            // 获取控件的文本内容  
            String userName = et_name.getText().toString();// 用户名  
            String userPass = et_pass.getText().toString();// 用户密码  
            //判断用户名和密码是否为空  
            if (TextUtils.isEmpty(userName.trim())  
                    || TextUtils.isEmpty(userPass.trim())) {  
                Toast.makeText(this, "用户名或者密码不能为空", Toast.LENGTH_LONG).show();  
            } else {  
                // 发送请求给服务器  
                //调用:loginByAsyncHttpClientPost(userName, userPass);  
                loginByAsyncHttpClientGet(userName, userPass);  
            }  
            break;  
        }  
    }  
 
    /** 
     * 采用AsyncHttpClient的Post方式进行实现 
     * @param userName 
     * @param userPass 
     */  
    public void loginByAsyncHttpClientPost(String userName, String userPass) {  
        AsyncHttpClient client = new AsyncHttpClient(); // 创建异步请求的客户端对象  
        String url = "http://172.16.237.200:8080/video/login.do"; // 定义请求的地址  
        // 创建请求参数的封装的对象  
        RequestParams params = new RequestParams();  
        params.put("username", userName); // 设置请求的参数名和参数值  
        params.put("userpass", userPass);// 设置请求的参数名和参数  
        // 执行post方法  
        client.post(url, params, new AsyncHttpResponseHandler() {  
            /** 
             * 成功处理的方法 
             * statusCode:响应的状态码; headers:相应的头信息 比如 响应的时间,响应的服务器 ; 
             * responseBody:响应内容的字节 
             */  
            @Override  
            public void onSuccess(int statusCode, Header[] headers,  
                    byte[] responseBody) {  
                if (statusCode == 200) {  
                    tv_result.setText(new String(responseBody)); // 设置显示的文本  
                }  
            }  
 
            /** 
             * 失败处理的方法 
             * error:响应失败的错误信息封装到这个异常对象中 
             */  
            @Override  
            public void onFailure(int statusCode, Header[] headers,  
                    byte[] responseBody, Throwable error) {  
                error.printStackTrace();// 把错误信息打印出轨迹来  
            }  
        });  
    }  
 
    /** 
     * 采用AsyncHttpClient的Get方式进行实现 
     * @param userName 
     * @param userPass 
     */  
    public void loginByAsyncHttpClientGet(String userName, String userPass) {  
        // 创建异步的客户端对象  
        AsyncHttpClient client = new AsyncHttpClient();  
        // 请求的地址  
        String url = "http://172.16.237.200:8080/video/login.do";  
        // 创建请求参数的封装的对象  
        RequestParams params = new RequestParams();  
        params.put("username", userName); // 设置请求的参数名和参数值  
        params.put("userpass", userPass);// 设置请求的参数名和参数  
 
        // 发送get请求的时候 url地址 相应参数,匿名回调对象  
        client.get(url, params,new AsyncHttpResponseHandler() {  
            @Override  
            public void onSuccess(int statusCode, Header[] headers,  
                    byte[] responseBody) {  
                // 成功处理的方法  
                System.out  
                        .println("statusCode-------------------" + statusCode);  
                // 遍历头信息  
                for (int i = 0; i < headers.length; i++) {  
                    Header header = headers[i];  
                    System.out.println("header------------Name:"  
                            + header.getName() + ",--Value:"  
                            + header.getValue());  
                }  
                // 设置控件内容  
                tv_result.setText(new String(responseBody));  
            }  
 
            @Override  
            public void onFailure(int statusCode, Header[] headers,  
                    byte[] responseBody, Throwable error) {  
                // 失败处理的方法  
                error.printStackTrace();  
            }  
        });  
    }  
 
}

 

 

 

 

 

package com.http;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.BinaryHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;
 
public class HttpUtil {
    private static     AsyncHttpClient client =new AsyncHttpClient();    //实例话对象
    static
    {
        client.setTimeout(11000);   //设置链接超时,如果不设置,默认为10s
    }
    public static void get(String urlString,AsyncHttpResponseHandler res)    //用一个完整url获取一个string对象
    {
        client.get(urlString, res);
    }
    public static void get(String urlString,RequestParams params,AsyncHttpResponseHandler res)   //url里面带参数
    {
        client.get(urlString, params,res);
    }
    public static void get(String urlString,JsonHttpResponseHandler res)   //不带参数,获取json对象或者数组
    {
        client.get(urlString, res);
    }
    public static void get(String urlString,RequestParams params,JsonHttpResponseHandler res)   //带参数,获取json对象或者数组
    {
        client.get(urlString, params,res);
    }
    public static void get(String uString, BinaryHttpResponseHandler bHandler)   //下载数据使用,会返回byte数据
    {
        client.get(uString, bHandler);
    }
    public static AsyncHttpClient getClient()
    {
        return client;
    }
}

 

package com.http;
 
import java.io.File;
import java.io.FileOutputStream;
 
import org.json.JSONArray;
import org.json.JSONObject;
 
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
 
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.BinaryHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;
 
public class MainActivity extends Activity {
    private TextView textView; // 顶部textview
    private ProgressDialog pDialog;
    private TextView textView2; // 下面textview,显示获取的所有数据
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text);
        textView2 = (TextView) findViewById(R.id.text2);
    }
    public void method1(View view) {
        pDialog = ProgressDialog.show(this, "请稍等", "数据加载中");
        String urlString = "http://client.azrj.cn/json/cook/cook_list.jsp?type=1&p=2&size=10"; // 一個獲取菜谱的url地址
        HttpUtil.get(urlString, new AsyncHttpResponseHandler() {
            public void onSuccess(String arg0) { // 获取数据成功会调用这里
                pDialog.dismiss();
                textView.setText("获取json数据成功,看下面");
                textView2.setText(arg0);
                Log.i("hck", arg0);
            };
            public void onFailure(Throwable arg0) { // 失败,调用
                Toast.makeText(MainActivity.this, "onFailure",
                        Toast.LENGTH_LONG).show();
            };
            public void onFinish() { // 完成后调用,失败,成功,都要掉
            };
        });
    }
    public void method2(View view) {
        String urlString = "http://client.azrj.cn/json/cook/cook_list.jsp?";
        RequestParams params = new RequestParams(); // 绑定参数
        params.put("type", "1");
        params.put("p", "2");
        params.put("size", "10");
        HttpUtil.get(urlString, params, new JsonHttpResponseHandler() {
            public void onSuccess(JSONArray arg0) { // 成功后返回一个JSONArray数据
                Log.i("hck", arg0.length() + "");
                try {
                    textView.setText("菜谱名字:"
                            + arg0.getJSONObject(2).getString("name")); //返回的是JSONArray, 获取JSONArray数据里面的第2个JSONObject对象,然后获取名字为name的数据值
                } catch (Exception e) {
                    Log.e("hck", e.toString());
                }
            };
            public void onFailure(Throwable arg0) {
                Log.e("hck", " onFailure" + arg0.toString());
            };
            public void onFinish() {
                Log.i("hck", "onFinish");
            };
            public void onSuccess(JSONObject arg0) {   //返回的是JSONObject,会调用这里
                Log.i("hck", "onSuccess ");
                try {
                    textView.setText("菜谱名字:"
                            + arg0.getJSONArray("list").getJSONObject(0)
                                    .getString("name"));
                } catch (Exception e) {
                    Log.e("hck", e.toString());
                }
            };
        });
    }
    public void method3(View view) {
        String urlString = "http://client.azrj.cn/json/cook/cook_list.jsp?type=1&p=2&size=10";
        HttpUtil.get(urlString, new JsonHttpResponseHandler() {
            public void onSuccess(JSONObject arg0) {
                try {
                    textView.setText("菜谱名字:"
                            + arg0.getJSONArray("list").getJSONObject(1)
                                    .getString("name"));
                } catch (Exception e) {
                    Log.e("hck", e.toString());
                }
            };
        });
    }
    public void method4(View view) {
        String urlString = "http://client.azrj.cn/json/cook/cook_list.jsp?";
        final RequestParams params = new RequestParams();
        params.put("type", "1");
        params.put("p", "2");
        params.put("size", "10");
        HttpUtil.get(urlString, params, new AsyncHttpResponseHandler() {
            public void onSuccess(String arg0) {
                try {
                    JSONObject jObject = new JSONObject(arg0);
                    textView.setText("菜谱名字:"
                            + jObject.getJSONArray("list").getJSONObject(2)
                                    .getString("name"));
                    Log.i("hck", params.getEntity().toString());
                } catch (Exception e) {
                }
            };
        });
    }
    public void method5(View view) {
        String url = "http://f.hiphotos.baidu.com/album/w%3D2048/sign=38c43ff7902397ddd6799f046dbab3b7/9c16fdfaaf51f3dee973bf7495eef01f3b2979d8.jpg";
        HttpUtil.get(url, new BinaryHttpResponseHandler() {
            @Override
            public void onSuccess(byte[] arg0) {
                super.onSuccess(arg0);
                File file = Environment.getExternalStorageDirectory();
                File file2 = new File(file, "cat");
                file2.mkdir();
                file2 = new File(file2, "cat.jpg");
                try {
                    FileOutputStream oStream = new FileOutputStream(file2);
                    oStream.write(arg0);
                    oStream.flush();
                    oStream.close();
                    textView.setText("可爱的猫咪已经保存在sdcard里面");
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.i("hck", e.toString());
                }
            }
        });
    }
}

 

 

参考:

http://blog.csdn.net/redarmy_chen/article/details/26980613

http://www.myexception.cn/operating-system/1666231.html

http://www.open-open.com/lib/view/open1369637365753.html

更新日期: 2014-11-26 11:43:05
文章标签:
文章链接: Android开源框架android-async-http使用
站方声明: 除特别标注, 本站所有文章均为原创, 互联分享, 尊重版权, 转载请注明.