android请求网络——第三方库android-async-http的使用(1)

本文系原创,转载请附原文地址:
http://blog.csdn.net/a774057695/article/details/47271543
正如我上一篇关于网络请求错误码的博客中所说的一样,我们开发移动端产品几乎都是要和服务器交互的,也就是说要要访问网络的,一般都是https协议。而我们自己写的代码,往往杂乱不堪。试想一下,开启线程访问网络,根据不同的状况产生不同的message,按照message再处理不同的逻辑……不是身经百战的老手真的是很难将代码处理的很优雅,换言之,一般人写的都很难维护,甚至自己回过头来看都难受。        

所幸这个世界上有需求就会有人提供服务,所幸这个服务还是不收费的,那就是开源项目:android-async-http。

        该项目的托管地址:https://github.com/loopj/android-async-http,该项目还在不停的完善,contributor也非常的多,也有一些前辈在很久之前就写过一些demo+文章来介绍如何使用这个功能强大的类库,然而随着版本更迭,有些方法已经被修改甚至废弃。

        本文书写的目的:

  1. 养成一个习惯;
  2. 帮助一些还没有适应看英文api文档,又找不到快速上手帮助内容的朋友。
        官方文档地址:https://loopj.com/android-async-http/doc/。

我可以想象好多朋友发现这个项目后不是第一时间去看文档的,而是关心着自己要处理的问题,或者说,如何使用这个类库来解决自己的问题,所以会更加关心sample,但是项目中给的sample非常吓人,庞杂到你不愿意去研究代码,而且这个sample还依赖于其他类库(名字没记错的话是fasterXml,擅长处理xml和json),大家可能会更关心simple use。

        作为一个小系列的第一篇(我也没想好要写几篇),上来就说了很多“废话”。下面进入正题。

        本文中使用的类库版本是1.4.8,截至本文编辑时间依旧是最新版,大家可以去官网中下载(拉源码下来更好)。为防止版本更新,1.4.8版本的获取不再便捷,这里提供csdn资源链接:http://download.csdn.net/detail/a774057695/8957907,

        首先,请下载该类库(使用eclipse 的话)。

然后新建一个测试项目(该类库支持的最低sdk版本非常非常低,大家现在开发面向的也主要是android4.X,所以基本不用担心sdk版本的问题,我也就不去查它支持的sdk版本了)。

不要着急做其他的事情,先把权限添加好!

将类库拷贝到libs目录下,配置一下。

我们最常用的就是get和post方法,再区分为是否带params,正如官方所建议的一样,我们有必要为常用的方法建一个方法类,再次封装。

所以我们新建一个类,就叫做HttpUtil

<span style="font-size:18px;">[your package name]

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();
    
    //设置链接超时,如果不设置,默认为10s
    static
    {
        client.setTimeout(3000);
    }
    
    /**
     * 不带访问params,get方式
     * 返回byte[],可自行处理
     * */
    public static void get(String urlString,AsyncHttpResponseHandler res)
    {
        client.get(urlString, res);
    }
    
    /**
     * 带访问params,get方式
     * 返回byte[],可自行处理
     * */
    public static void get(String urlString,RequestParams params,AsyncHttpResponseHandler res)
    {
        client.get(urlString, params,res);
    }
    
    /**
     * 不带params、get方法
     * 获取JsonObject或者JsonArray
     * */
    public static void get(String urlString,JsonHttpResponseHandler res)
    {
        client.get(urlString, res);
    }
    
    /**
     * 带params、get方法
     * 获取JsonObject或者JsonArray
     * */
    public static void get(String urlString,RequestParams params,JsonHttpResponseHandler res)
    {
        client.get(urlString, params,res);
    }
    
    /**
     * 下载数据使用
     * 返回byte数据
     * */
    public static void get(String uString, BinaryHttpResponseHandler bHandler)
    {
        client.get(uString, bHandler);
    }
    
    /**
     * 不带访问params, post
     * 这种情况较为少见
     * */
    public static void postWithoutParams(String urlString, AsyncHttpResponseHandler res)
    {
    	client.post(urlString, res);
    }
    
    /**
     * 带访问params,post,params会被转表单数据
     * */
    public static void postWithParams(String urlString,RequestParams params, AsyncHttpResponseHandler res)
    {
    	client.post(urlString, params, res);
    }
    
    public static AsyncHttpClient getClient()
    {
        return client;
    }
}
</span>
这里我们已经有了一些常用的方法,更多的更强大的方法应该去官方文档中去发现,琢磨,写demo测试印证,然后写blog大笑

接下来我们就要使用这些方法。

先改一下布局文件吧:这里只是一个demo,就不按规范来了。

<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <Button
                android:id="@+id/b1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="getWithoutParams" />

            <Button
                android:id="@+id/b2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="getWithParams" />

            <Button
                android:id="@+id/b3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="postWithoutParams" />

            <Button
                android:id="@+id/b4"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text="postWithParams" />

        </LinearLayout>
    </ScrollView>

</LinearLayout>
</span>
它看起来会是这个样子:



(csdn的图总是好大。。。)

这里我们也猜到了我们这次只使用四个功能

<span style="font-size:18px;">[your package name]

import org.apache.http.Header;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button b1 = (Button)findViewById(R.id.b1);
		Button b2 = (Button)findViewById(R.id.b2);
		Button b3 = (Button)findViewById(R.id.b3);
		Button b4 = (Button)findViewById(R.id.b4);
		
		b1.setOnClickListener(bt_listener);
		b2.setOnClickListener(bt_listener);
		b3.setOnClickListener(bt_listener);
		b4.setOnClickListener(bt_listener);
	}
	OnClickListener bt_listener = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			switch(v.getId()) {
				case R.id.b1:
					getWithoutParams();
					break;
				case R.id.b2:
					getWithParams();
					break;
				case R.id.b3:
					postWithoutParams();
					break;
				case R.id.b4:
					postWithParams();
					break;
				default:
					break;
			}
		}
	};
	
	
	 private void getWithoutParams() {
	       final ProgressDialog pDialog = ProgressDialog.show(this, "please wait:", "loading……");
	        String urlString = [baseurl]; 
	        HttpUtil.get(urlString, new AsyncHttpResponseHandler() {

				@Override
				public void onFailure(int arg0, Header[] arg1, byte[] arg2,
						Throwable arg3) {
					// TODO 处理返回码 arg0 
					pDialog.dismiss();
					Log.i("statuscode:", ""+arg0);
					Log.i("throw:", ""+arg3);
//					arg3.printStackTrace(System.out);
				}
				@Override
				public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
					// TODO 处理arg2
					pDialog.dismiss();
					Log.i("headers:",""+arg1);
					Log.i("statuscode:", ""+arg0);
					String jsonString = new String(arg2);
					Log.i("response:",jsonString);
				}
	        });
	    }
	
	 
	 private void getWithParams() {
	       	final ProgressDialog pDialog = ProgressDialog.show(this, "please wait:", "loading……");
	        String urlString = <span style="font-family: Arial, Helvetica, sans-serif;">[baseurl]</span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">;</span>
	        RequestParams params = new RequestParams();
	        params.add([key],[value]);
	 
	        
	        HttpUtil.get(urlString, params, new AsyncHttpResponseHandler() {

				@Override
				public void onFailure(int arg0, Header[] arg1, byte[] arg2,
						Throwable arg3) {
					// TODO 处理返回码 arg0 
					pDialog.dismiss();
					Log.i("statuscode:", ""+arg0);
					Log.i("throw:", ""+arg3);
//					arg3.printStackTrace(System.out);
				}
				@Override
				public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
					// TODO 处理arg2
					pDialog.dismiss();
					Log.i("headers:",""+arg1);
					Log.i("statuscode:", ""+arg0);
					String jsonString = new String(arg2);
					Log.i("response:",jsonString);
				}
	        });
	    }
	 
	 
	 private void postWithoutParams() {
		 final ProgressDialog pDialog = ProgressDialog.show(this, "please wait:", "loading……");
	        String urlString = [baseurl];
	        RequestParams params = new RequestParams();
	        params.add([key],[value]);// e.g: <span style="font-family: Arial, Helvetica, sans-serif;">params.add("key","value");</span>
	       	        
	        HttpUtil.postWithoutParams(urlString, new AsyncHttpResponseHandler() {

				@Override
				public void onFailure(int arg0, Header[] arg1, byte[] arg2,
						Throwable arg3) {
					// TODO 处理返回码 arg0 
					pDialog.dismiss();
					Log.i("statuscode:", ""+arg0);
					Log.i("throw:", ""+arg3);
//					arg3.printStackTrace(System.out);
				}
				@Override
				public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
					// TODO 处理arg2
					pDialog.dismiss();
					Log.i("headers:",""+arg1);
					Log.i("statuscode:", ""+arg0);
					String jsonString = new String(arg2);
					Log.i("response:",jsonString);
				}
	        });
	 }
	 
	private void postWithParams() {
		final ProgressDialog pDialog = ProgressDialog.show(this, "please wait:", "loading……");
        String urlString = [baseurl];
        RequestParams params = new RequestParams();       
params.add([key],[value])</span>
HttpUtil.postWithParams(urlString, params, new AsyncHttpResponseHandler() {@Overridepublic void onFailure(int arg0, Header[] arg1, byte[] arg2,Throwable arg3) {// TODO 处理返回码 arg0 pDialog.dismiss();Log.i("statuscode:", ""+arg0);Log.i("throw:", ""+arg3);String er = new String(arg2);Log.i("errorResponse:",""+er);arg3.printStackTrace(System.out);}@Overridepublic void onSuccess(int arg0, Header[] arg1, byte[] arg2) {// TODO 处理arg2pDialog.dismiss();Log.i("headers:",""+arg1);Log.i("statuscode:", ""+arg0);String jsonString = new String(arg2);Log.i("response:",jsonString);} });}@Overridepublic 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;}}

 
这次我们只展示怎么使用,不去做进一步的处理,不管是onSuccess还是onFailure,至于retry我们也暂时不管。 

其中的arg0是返回码,例如200,404等等,对于失败的(以及断网等情况抛IO异常的,返回码是初始值0),我们要按照返回码处理,成功的我们要处理arg2,就是服务器返回给你的信息,arg3是抛出的异常。

这里我不多做赘述,值得一提的是get方式中的参数指的是url中?后面的,例如http://www.abc.com/index.php?r=qwer&&name=asdf.

baseurl 就是:http://www.abc.com/index.php

params就是:<r,qwer>、<name,asdf>.

而post方式中,我们的params会被转表单数据,不再是urlparam,所以要注意服务器接口的设计。

这次的废话说得有点多,这个小系列的其他文章会直切主题。

下一篇将会是得到数据进一步处理的策略,侧重于对异常、失败的处理。

今天就到这里。

转载请附原文地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值