本文系原创,转载请附原文地址:
http://blog.csdn.net/a774057695/article/details/47271543
正如我上一篇关于网络请求错误码的博客中所说的一样,我们开发移动端产品几乎都是要和服务器交互的,也就是说要要访问网络的,一般都是https协议。而我们自己写的代码,往往杂乱不堪。试想一下,开启线程访问网络,根据不同的状况产生不同的message,按照message再处理不同的逻辑……不是身经百战的老手真的是很难将代码处理的很优雅,换言之,一般人写的都很难维护,甚至自己回过头来看都难受。
所幸这个世界上有需求就会有人提供服务,所幸这个服务还是不收费的,那就是开源项目:android-async-http。
该项目的托管地址:https://github.com/loopj/android-async-http,该项目还在不停的完善,contributor也非常的多,也有一些前辈在很久之前就写过一些demo+文章来介绍如何使用这个功能强大的类库,然而随着版本更迭,有些方法已经被修改甚至废弃。
本文书写的目的:
- 养成一个习惯;
- 帮助一些还没有适应看英文api文档,又找不到快速上手帮助内容的朋友。
我可以想象好多朋友发现这个项目后不是第一时间去看文档的,而是关心着自己要处理的问题,或者说,如何使用这个类库来解决自己的问题,所以会更加关心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,所以要注意服务器接口的设计。
这次的废话说得有点多,这个小系列的其他文章会直切主题。
下一篇将会是得到数据进一步处理的策略,侧重于对异常、失败的处理。
今天就到这里。
转载请附原文地址