AsyncHttpClient传输

原文:http://www.cnblogs.com/angeldevil/p/3729808.html

客户端和服务器之间的数据传输

 AsyncHttpClient  是一个框架提供的库  可以异步传输,它的网络请求自动在非UI,使用时需下载android-async-http-1.4.4.jar包导入到项目中。

通过AsyncHttpClient类的实例就可以执行网络请求,包括get、put、post、head、delete。并指定一个ResponseHandlerInterface的实例接收请求结果。

 

主要类介绍:

  • AsyncHttpRequest

继承自Runnabler,被submit至线程池执行网络请求并发送start,success等消息

  • AsyncHttpResponseHandler

接收请求结果,一般重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息

  • TextHttpResponseHandler

继承自AsyncHttpResponseHandler,只是重写了AsyncHttpResponseHandler的onSuccess和onFailure方法,将请求结果由byte数组转换为String

  • JsonHttpResponseHandler

继承自TextHttpResponseHandler,同样是重写onSuccess和onFailure方法,将请求结果由String转换为JSONObject或JSONArray

  • BaseJsonHttpResponseHandler

继承自TextHttpResponseHandler,是一个泛型类,提供了parseResponse方法,子类需要提供实现,将请求结果解析成需要的类型,子类可以灵活地使用解析方法,可以直接原始解析,使用gson等。

  • RequestParams

请求参数,可以添加普通的字符串参数,并可添加File,InputStream上传文件

  • AsyncHttpClient

核心类,使用HttpClient执行网络请求,提供了get,put,post,delete,head等请求方法,使用起来很简单,只需以url及RequestParams调用相应的方法即可,还可以选择性地传入Context,用于取消Content相关的请求,同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类,一般为AsyncHttpResponseHandler的子类,AsyncHttpClient内部有一个线程池,当使用AsyncHttpClient执行网络请求时,最终都会调用sendRequest方法,在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行。

  • SyncHttpClient

继承自AsyncHttpClient,同步执行网络请求,AsyncHttpClient把请求封装成AsyncHttpRequest后提交至线程池,SyncHttpClient把请求封装成AsyncHttpRequest后直接调用它的run方法。

 

请求流程:

  1. 调用AsyncHttpClient的get或post等方法发起网络请求
  2. 所有的请求都走了sendRequest,在sendRequest中把请求封装为了AsyncHttpRequest,并添加到线程池执行
  3. 当请求被执行时(即AsyncHttpRequest的run方法),执行AsyncHttpRequest的makeRequestWithRetries方法执行实际的请求,当请求失败时可以重试。并在请求开始,结束,成功或失败时向请求时传的ResponseHandlerInterface实例发送消息
  4. 基本上使用的都是AsyncHttpResponseHandler的子类,调用其onStart,onSuccess等方法返回请求结果

总结:

1. Android-Async-Http的使用非常简单,通过AsyncHttpClient发起请求就可以了,如果需要添加参数,直接传一个RequestParams过去,而且参数可以是String、File和InputStream,可以很方便地上传文件。

2. 每个请求都需要传一个ResponseHandlerInterface的实例用以接收请求结果或请求失败,请求结束等通知,一般是AsyncHttpResponseHandler的子类。

3. 通过BinaryHttpResponseHandler可以发起二进制请求,如请求图片。

4. 通过TextHttpResponseHandler可以发起返回结果为字符串的请求,一般这个使用较多。

5. 也可以使用它的子类JsonHttpResponseHandler,返回结果是一个JSONObject或JSONArray。不过感觉这个类作用不大,一是有另一个类BaseJsonHttpResponseHandler,可以直接解析返回的JSON数据,二是JsonHttpResponseHandler的方法太复杂了,有太多的onSuccess和onFailure方法,都不知道重写哪个了。

 


  
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
AsyncHttpClient  clientLogin  =  new  AsyncHttpClient(); //AsyncHttpClient
             String  urlLogin  =  "http://192.168.1.195:8080/appserver/app"; //Url
             RequestParams  paramsLogin  =  new  RequestParams(); //RequestParams
             paramsLogin. add( "uc"userName);
             paramsLogin. add( "psw"passWord);
             clientLogin. post( urlLoginnullnew  AsyncHttpResponseHandler() { //posturl
                @ Override
                 public  void  onSuccess( int  iHeader[]  headersbyte[]  bytes) {
                     if ( i  ==  200) {
                         String  loginResults  =  new  String( bytes);
                         try {
                             JSONObject  jsonObject  =  new  JSONObject( loginResults);
                             String  code  =  jsonObject. getString( "code");
                             String  massage  =  jsonObject. getString( "msg");
                             System. out. println( "msg"  +  massage);
                             if( code. equals( "01")){ //
                                 SharedPreferences. Editor  editor  =  getSharedPreferences( Constant. preferenceName
, MODE_PRIVATE). edit();
                                 editor. putString( "userName", userName);
                                 editor. putString( "password"passWord);
                                 editor. commit();
                                 Toast. makeText( LoginActivity. this, massage, Toast. LENGTH_SHORT). show();
                                 boolean  isnewuser  =  UserDao. getInstance( LoginActivity. this). isNewUser( LoginActiv
ity. this, userName);
                                 Toast. makeText( LoginActivity. this"dddd" + isnewuserToast. LENGTH_SHORT). show();
                                 if( isnewuser){
                                     UserDao. getInstance( LoginActivity. this). insertUserInfo( LoginActivity. this
, userName, passWord);
                                     Toast. makeText( LoginActivity. thismassage  +  "mmmmmmmmmmmmm"Toast. LENGTH_S
HORT). show();
                                }
                                 int  userId  =  UserDao. getInstance( LoginActivity. this). getUserId( LoginActivity
. this);
                                 Log. i( "ggg", "userId" + userId);
                                 SharedPreferences. Editor  editor2  =  getSharedPreferences( Constant. preferenceName
, MODE_PRIVATE). edit();
                                 editor2. putBoolean( "isLogin"true); //
                                 editor2. putInt( "userId"userId);
                                 editor2. commit();
                                 Toast. makeText( LoginActivity. this, massage + "eeeeeeeeeeeee", Toast. LENGTH_SHORT
). show();
                                 Intent  intent  =  new  Intent( LoginActivity. thisActivityMain. class);
                                 startActivity( intent);
                                 LoginActivity. this. finish();
                            } else  if( code. equals( "02")){ //
                                 Toast. makeText( LoginActivity. this, massage, Toast. LENGTH_SHORT). show();
                            }
                        }  catch ( Exception  e) {
                             Toast. makeText( LoginActivity. this""Toast. LENGTH_SHORT). show();
                        }
                    }  else {
                         Toast. makeText( LoginActivity. this""Toast. LENGTH_SHORT). show();
                    }
                }
                @ Override
                 public  void  onFailure( int  iHeader[]  headersbyte[]  bytesThrowable  throwable) {
                     Toast. makeText( LoginActivity. this""Toast. LENGTH_SHORT). show();
                     backLoginActivity();
                     box. hideAll();
                }
            });

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值