@Field(POST请求):
用于传送表单数据:
`@FormUrlEncoded
@POST(“user/edit”)
Call updateUser(@Field(“first_name”) String first, @Field(“last_name”) String last);`
注意开头必须多加上@FormUrlEncoded
这句注释,不然会报错。表单自然是有多组键值对组成,这里的first_name就是键,而具体传入的first就是值啦。
@Header/@Headers(POST请求):
用于添加请求头部:
`@GET(“user”)
Call getUser(@Header(“Authorization”) String authorization)`
表示将头部Authorization属性设置为你传入的authorization;当然你还可以用@Headers表示,作用是一样的比如:
`@Headers(“Cache-Control: max-age=640000”)
@GET(“user”)
Call getUser()`
当然你可以多个设置:
`@Headers({
“Accept: application/vnd.github.v3.full+json”,
“User-Agent: Retrofit-Sample-App”
})
@GET(“user”)
Call getUser()`
好了,这样我们就把上面这个RetrofitService 接口类解释的差不多了。我觉得,Retrofit最主要的也就是这个接口类的定义了。好了,有了这个接口类,我们来看一下,到底如何使用这个我们定义的接口来进行网络请求。代码如下:
`Retrofit retrofit = new Retrofit.Builder()
.baseUrl(“https://api.douban.com/v2/”)
.addConverterFactory(GsonConverterFactory.create(new GsonBuilder().create()))
.build();
RetrofitService service = retrofit.create(RetrofitService.class);
Call call = service.getSearchBook(“金瓶梅”, null, 0, 1);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
text.setText(response.body()+“”);
}
@Override
public void onFailure(Call call, Throwable t) {
}
});`
这里我们可以看到,先新建了一个Retrofit对象,然后给它设置一个我们前面说的baseUrlhttps://api.douban.com/v2/
.因为接口返回的数据不是我们需要的实体类,我们需要调用addConverterFactory方法进行转换。由于返回的数据为json类型,所以在这个方法中传入Gson转换工厂GsonConverterFactory.create(new GsonBuilder().create())
,这里我们需要在studio中添加Gson的依赖:
compile ‘com.squareup.retrofit2:converter-gson:2.1.0’
然后我们调用retrofit的create方法并传入上面我们定义的接口的文件名RetrofitService.class,就可以得到RetrofitService 的实体对象。有了这个对象,我们就可以调用里面之前定义好的请求方法了。比如:
Call<Book> call = service.getSearchBook("金瓶梅", null, 0, 1);
它会返回一个Call实体类,然后就可以调用Call的enqueue方法进行异步请求,在enqueue方法中传入一个回调CallBack,重写里面的onResponse和
onFailure方法,也就是请求成功和失败的回调方法。当成功时,它会返回Response,里边封装了请求结果的所有信息,包括报头,返回码,还有主体等。比如调用它的body()方法就可获得Book对象,也就是我们需要的数据。这里我们就把返回的Book,显示屏幕上。如下图:
好了,到这里我们就基本了解了Retrofit的整个工作流程。
3.RxJava
我们这篇文章主要介绍搭建整体网络请求框架,所以关于RxJava的基础知识,我这就不再详细介绍了,网上也有很多文章,对RxJava还不是很了解的同学,推荐你看一下扔物线的这篇文章给 Android 开发者的 RxJava 详解
下面我们来看一下RxJava和retrofit的结合使用,为了使Rxjava与retrofit结合,我们需要在Retrofit对象建立的时候添加一句代码addCallAdapterFactory(RxJavaCallAdapterFactory.create())
,当然你还需要在build.gradle文件中添加如下依赖:
compile ‘com.squareup.retrofit2:adapter-rxjava:2.1.0’
完整的代码如下:
`Retrofit retrofit = new Retrofit.Builder()
.baseUrl(“https://api.douban.com/v2/”)
.addConverterFactory(GsonConverterFactory.create(new GsonBuilder().create()))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//支持RxJava
.build();`
然后我们还需要修改RetrofitService 中的代码:
`public interface RetrofitService {
@GET(“book/search”)
Observable getSearchBook(@Query(“q”) String name,
@Query(“tag”) String tag, @Query(“start”) int start,
@Query(“count”) int count);`
可以看到,在原来的RetrofitService 中我们把getSearchBook方法返回的类型Call改为了Observable,也就是被观察者。其他都没变。然后就是创建RetrofitService 实体类:
RetrofitService service = retrofit.create(RetrofitService.class);
和上面一样,创建完RetrofitService ,就可以调用里面的方法了:
Observable<Book> observable = service.getSearchBook("金瓶梅", null, 0, 1);
其实这一步,就是创建了一个rxjava中observable,即被观察者,有了被观察者,就需要一个观察者,且订阅它:
`observable.subscribeOn(Schedulers.io())//请求数据的事件发生在io线程
.observeOn(AndroidSchedulers.mainThread())//请求完成后在主线程更显UI
.subscribe(new Observer() {//订阅
@Override
public void onCompleted() {
//所有事件都完成,可以做些操作。。。
}
@Override
public void onError(Throwable e) {
e.printStackTrace(); //请求过程中发生错误
}
@Override
public void onNext(Book book) {//这里的book就是我们请求接口返回的实体类
}
}`
在上面中我们可以看到,事件的消费在Android主线程,所以我们还要在build.gradle中添加如下依赖:
compile ‘io.reactivex:rxandroid:1.2.0’
这样我们就引入了RxAndroid,RxAndroid其实就是对RxJava的扩展。比如上面这个Android主线程在RxJava中就没有,因此要使用的话就必须得引用RxAndroid。
4.实践
接下来我们就看看,在一个项目中上面三者是如何配合的。我们打开Android Studio,新建一个项目取名为MVPDemo。这个demo的功能也很简单,就是点击按钮调用上面的那个测试接口,将请求下来书的信息显示在屏幕上。首先我们来看一下这个工程的目录结构:
我们可以看到,在项目的包名下,我们建了三个主要的文件夹:app、service、ui。当然根据项目的需要你也可以添加更多其他的文件夹,比如一些工具类等。其中app文件夹中可以建一个Application类,用于设置应用全局的一些属性,这里为了使项目更加简单就没有添加;然后,我们再来看看ui文件夹下,这个文件夹下主要放一些关于界面的东西。在里面我们又建了三个文件夹:activity、adapter、fragment,我想看名字你就清楚里面要放什么了。最后我们在重点看看service文件夹中的东西。首先我们来看看里面重要的两个类:RetrofitHelper和RetrofitService。RetrofitHelper主要用于Retrofit的初始化:
`public class RetrofitHelper {
private Context mCntext;
OkHttpClient client = new OkHttpClient();
GsonConverterFactory factory = GsonConverterFactory.create(new GsonBuilder().create());
private static RetrofitHelper instance = null;
private Retrofit mRetrofit = null;
public static RetrofitHelper getInstance(Context context){
if (instance == null){
instance = new RetrofitHelper(context);
}
return instance;
}
private RetrofitHelper(Context mContext){
mCntext = mContext;
init();
}
private void init() {
resetApp();
}
private void resetApp() {
mRetrofit = new Retrofit.Builder()
.baseUrl(“https://api.douban.com/v2/”)
.client(client)
.addConverterFactory(factory)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
public RetrofitService getServer(){
return mRetrofit.create(RetrofitService.class);
}
}`
代码并不复杂,其中resetApp方法,就是前面介绍的Retrofit的创建,getServer方法就是为了获取RetrofitService接口类的实例化。然后定义了一个静态方法getInstance用于获取自身RetrofitHelper的实例化,并且只会实例化一次。
接下来,看一下RetrofitService,其中代码还是上面一样:
`public interface RetrofitService {
@GET(“book/search”)
Observable getSearchBooks(@Query(“q”) String name,
@Query(“tag”) String tag, @Query(“start”) int start,
@Query(“count”) int count);
}`
然后我们依次来看一下service文件夹下的四个文件夹:entity、manager、presenter和view。其中entity下放我们请求的实体类,这里就是Book。接下来我们来看一下manager中DataManager。这个类其实就是为了让你更方便的调用RetrofitService 中定义的方法:
`public class DataManager {
private RetrofitService mRetrofitService;
public DataManager(Context context){
this.mRetrofitService = RetrofitHelper.getInstance(context).getServer();
}
public Observable getSearchBooks(String name,String tag,int start,int count){
return mRetrofitService.getSearchBooks(name,tag,start,count);
}
}`
可以看到,在它的构造方法中,我们得到了RetrofitService 的实例化,然后定义了一个和RetrofitService 中同名的方法,里面其实就是调用RetrofitService 中的这个方法。这样,把RetrofitService 中定义的方法都封装到DataManager 中,以后无论在哪个要调用方法时直接在DataManager 中调用就可以了,而不是重复建立RetrofitService 的实例化,再调用其中的方法。
好了,我们再来看一下presenter和view,我们在前面说过,presenter主要用于网络的请求以及数据的获取,view就是将presenter获取到的数据进行展示。首先我们先来看view,我们看到我们建了两个接口类View和BookView,其中View是空的,主要用于和Android中的View区别开来:
`public interface View {
}`
然后让BookView继承自我们自己定义的View :
`public interface BookView extends View {
void onSuccess(Book mBook);
void onError(String result);
}`
可以看到在里面定义两个方法,一个onSuccess,如果presenter请求成功,将向该方法传入请求下来的实体类,也就是Book,view拿到这个数据实体类后,就可以进行关于这个数据的展示或其他的一些操作。如果请求失败,就会向这个view传入失败信息,你可以弹个Toast来提示请求失败。通常这两个方法比较常用,当然你可以根据项目需要来定义一些其他的方法。接下来我们看看presenter是如何进行网络请求的 。我们也定义了一个基础Presenter:
`public interface Presenter {
void onCreate();
void onStart();//暂时没用到
void onStop();
void pause();//暂时没用到
void attachView(View view);
void attachIncomingIntent(Intent intent);//暂时没用到
}`
里面我们可以看到,定义了一些方法,前面几个onCreate、onStart等方法对应着Activity中生命周期的方法,当然没必要写上Activity生命周期中所有回调方法,通常也就用到了onCreate和onStop,除非需求很复杂,在Activity不同生命周期请求的情况不同。接着我们定义了一个attachView方法,用于绑定我们定义的View。也就是,你想把请求下来的数据实体类给哪个View就传入哪个View。下面这个attachIncomingIntent暂且没用到,就不说了。好了,我们来看一下BookPresenter具体是怎么实现的:
`public class BookPresenter implements Presenter {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
文末
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android部分高级架构视频学习资源】
**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算