2024年安卓最全Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架(1),移动端页面开发框架图

结尾

最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。

首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)

泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶
注解原理丶注解原理丶序列化
Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)
代码框架结构优化(数据结构丶排序算法丶设计模式)
APP性能优化(用户体验优化丶适配丶代码调优)
热修复丶热升级丶Hook技术丶IOC架构设计
NDK(c编程丶C++丶JNI丶LINUX)
如何提高开发效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter

接下来是资料清单:(敲黑板!!!


1.数据结构和算法

2.设计模式

3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记

4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)

不论遇到什么困难,都不应该成为我们放弃的理由!共勉~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

我们这篇文章主要介绍搭建整体网络请求框架,所以关于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 {

private DataManager manager;

private CompositeSubscription mCompositeSubscription;

private Context mContext;

private BookView mBookView;

private Book mBook;

public BookPresenter (Context mContext){

this.mContext = mContext;

}

@Override

public void onCreate() {

manager = new DataManager(mContext);

mCompositeSubscription = new CompositeSubscription();

}

@Override

public void onStart() {

}

@Override

public void onStop() {

if (mCompositeSubscription.hasSubscriptions()){

mCompositeSubscription.unsubscribe();

}

}

@Override

public void pause() {

}

@Override

public void attachView(View view) {

mBookView = (BookView)view;

}

@Override

public void attachIncomingIntent(Intent intent) {

}

public void getSearchBooks(String name,String tag,int start,int count){

mCompositeSubscription.add(manager.getSearchBooks(name,tag,start,count)

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer() {

@Override

public void onCompleted() {

if (mBook != null){

mBookView.onSuccess(mBook);

}

}

@Override

public void onError(Throwable e) {

e.printStackTrace();

mBookView.onError(“请求失败!!”);

}

@Override

public void onNext(Book book) {

mBook = book;

}

})

);

}

}`

BookPresenter实现了我们定义的基础Presenter,在onCreate中我们创建了DataManager的实体类,便于调用RetrofitService中的方法,还新建了一个CompositeSubscription对象,CompositeSubscription是用来存放RxJava中的订阅关系的。注意请求完数据要及时清掉这个订阅关系,不然会发生内存泄漏。可在onStop中通过调用CompositeSubscription的unsubscribe方法来取消这个订阅关系,不过一旦调用这个方法,那么这个CompositeSubscription也就无法再用了,要想再用只能重新new一个。然后我们可以看到在attachView中,我们把BookView传进去。也就是说我们要把请求下来的实体类交给BookView来处理。接下来我们定义了一个方法getSearchBooks,名字和入参都和请求接口RetrofitService中的方法相同。这里的这个方法也就是请求的具体实现过程。其实也很简单,就是向CompositeSubscription添加一个订阅关系。上面我们已经说过manager.getSearchBooks就是调用RetrofitService的getSearchBooks方法,而这个方法返回的是一个泛型为Book的Observable,即被观察者,然后通过subscribeOn(Schedulers.io())来定义请求事件发生在io线程,然后通过observeOn(AndroidSchedulers.mainThread())来定义事件在主线程消费,即在主线程进行数据的处理,最后通过subscribe使观察者订阅它。在观察者中有三个方法:onNext、onCompleted、onError。当请求成功话,就会调用onNext,并传入请求返回的Book实体类,我们在onNext中,把请求下来的Book实体类存到内存中,当请求结束后会调用onCompleted,我们把请求下来的Book实体类交给BookView处理就可以了,如果请求失败,那么不会调用onCompleted而调用onError,这样我们可以向BookView传递错误消息。

好了,这样我们我们就可以调用这个接口方法来进行网络的请求了,我们先写一下页面的布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:id=“@+id/activity_main”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:paddingBottom=“@dimen/activity_vertical_margin”

android:paddingLeft=“@dimen/activity_horizontal_margin”

android:paddingRight=“@dimen/activity_horizontal_margin”

android:orientation=“vertical”

android:paddingTop=“@dimen/activity_vertical_margin”>

<TextView

android:id=“@+id/text”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“Hello World!” />

<Button

android:id=“@+id/button”

android:onClick=“getFollowers”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“请求”/>

界面很简单,一共两个控件,一个Button,点击时进行网络请求,一个TextView,用于显示请求下来的数据。然后我么看一下Activity中代码:

`public class MainActivity extends AppCompatActivity {

private TextView text;

private Button button;

private BookPresenter mBookPresenter = new BookPresenter(this);

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

text = (TextView)findViewById(R.id.text);

button = (Button)findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mBookPresenter.getSearchBooks(“金瓶梅”, null, 0, 1);

}

});

mBookPresenter.onCreate();

mBookPresenter.attachView(mBookView);

}

private BookView mBookView = new BookView() {

@Override

public void onSuccess(Book mBook) {

text.setText(mBook.toString());

}

@Override

public void onError(String result) {

Toast.makeText(MainActivity.this,result, Toast.LENGTH_SHORT).show();

如何做好面试突击,规划学习方向?

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

同时我还搜集整理2020年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节

image

在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。

image

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

同时我还搜集整理2020年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节

[外链图片转存中…(img-NL3xWVpU-1715732810871)]

在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。

[外链图片转存中…(img-YOW0iFPz-1715732810872)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值