您的位置:首页 > 理论基础 > 计算机网络

AndroidStudio下使用Retrofit进行网络请求

2016-02-22 15:42 585 查看


环境要求

Android 2.3及以上版本
Java 6及以上版本

配置

GRADLE配置文件下添加引用

view
sourceprint?

1.
<code
class
=
"
hljs r"
>


2.
dependencies
{


3.
...


4.
compile
'com.squareup.retrofit:retrofit:1.9.0'


5.
...


6.
}


7.
</code>


当OkHttp存在时,Retrofit会使用OkHttp来进行网络请求,使用OkHttp的添加引用如下


view
sourceprint?

1.
<code
class
=
"
hljs r"
>dependencies
{


2.
...


3.
compile
'com.squareup.okhttp:okhttp-urlconnection:2.0.0'


4.
compile
'com.squareup.okhttp:okhttp:2.0.0'


5.
...


6.
}</code>




发起请求

下面的例子是使用Retrofit进行一次简单的异步GET请求,返回的值为String类型

首先定义一个接口,在接口中声明一个方法来定义请求的相关内容

view
sourceprint?

1.
<code
class
=
"
hljs d"
>
interface
User
{


2.
@GET
(
"/user/list.json"
)


3.
void
getUsers(
@Query
(
"pagesize"
)
int
pagesize,
Callback<String> callback);


4.
}


5.
</code>




@GET表明该请求为GET方式,除此之外还有@POST, @PUT, @DELETE, 和@HEAD,具体的作用请参考官方文档,由于篇幅原因,这里不再叙述。

@Query为参数声明

Callback< String > 为回调接口,String表明返回数据结果就为String类型

然后创建一个RestAdapter对象,代码如下

view
sourceprint?

1.
<code
class
=
"
hljs avrasm"
>RestAdapter
restAdapter =
new
RestAdapter.Builder()


2.
.setEndpoint(CTX).setConverter(
new
BaseConverter())


3.
.build();</code>




setEndpoint方法指定了请求地址的前半部分,即服务器地址,如 https://api.github.com

setConverter方法需要一个转换接口的实现类作为参数,该类的作用是将请求得到的InputStream转换为想要的类型,示例代码如下

view
sourceprint?

01.
<code
class
=
"
hljs java"
>
public
class
BaseConverter
implements
Converter
{


02.
@Override


03.
public
Object
fromBody(TypedInput body, Type type)
throws
ConversionException
{


04.
ByteArrayOutputStream
baos =
new
ByteArrayOutputStream();


05.
int
i
= -
1
;


06.
String
response =
""
;


07.
try
{


08.
while
((i
= body.in().read())!= -
1
)
{


09.
baos.write(i);


10.
}


11.
response
= baos.toString();


12.
baos.close();


13.
}
catch
(IOException
e){


14.
e.printStackTrace();


15.
}


16.
return
response;


17.
}


18.


19.
@Override


20.
public
TypedOutput
toBody(
final
Object
object){


21.
return
new
TypedOutput()
{


22.
@Override


23.
public
String
fileName(){


24.
return
null
;


25.
}


26.


27.
@Override


28.
public
String
mimeType(){


29.
return
"String"
;


30.
}


31.


32.
@Override


33.
public
long
length()
{


34.
return
object
==
null
?
0
:
object.toString().length();


35.
}


36.


37.
@Override


38.
public
void
writeTo(OutputStream
out)
throws
IOException
{


39.
out.write(object.toString().getBytes());


40.
}


41.
};


42.
}


43.
}


44.
</code>




当得到了一个restAdapter 对象后,调用restAdapter的create方法得到User接口的实现类

view
sourceprint?

01.
<code
class
=
"
hljs java"
>
Callback<String> callback =
new
Callback<String>()
{


02.
@Override


03.
public
void
success(String
s, Response response){


04.


05.
}


06.


07.
@Override


08.
public
void
failure(RetrofitError
error){


09.


10.
}


11.
}


12.
User
user = getAdapter().create(User.
class
);


13.
//指定请求参数和回调接口的实现类


14.
user.getUsers(
12
,callback);</code>


Retrofit的强大之处就在于此,它会给根据接口的方法注解来实现该接口


代码混淆

如果需要进行代码混淆,配置如下

view
sourceprint?

1.
<code
class
=
"
hljs haml"
>-dontwarn
retrofit.**


2.
-keep
class
retrofit.**
{ *; }


3.
-keepattributes
Signature


4.
-keepattributes
Exceptions</code>







延伸阅读:

1、android 获取网络图片方法 常见错误以及解决办法

2、Android网络状态

3、Android 下载网络文件

4、Android Listview 分页 动态加载网络数据

5、Android网络应用开发从零开始做起

6、Android开发之APN网络切换

7、android 网络编程学习

8、Android作为客户端,PC作为服务端:实现网络通信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息