Rxjava+Retrofit进行网络请求(已设置网络缓存),并结合我所阐述的XRecylerView配合使用,完成下拉刷新与上拉加载分页显示效果(1)

Android核心知识点

面试成功其实是必然的,因为我做足了充分的准备工作,包括刷题啊,看一些Android核心的知识点,看一些面试的博客吸取大家面试的一些经验。

下面这份PDF是我翻阅了差不多3个月左右一些Android大博主的博客从他们那里取其精华去其糟泊所整理出来的一些Android的核心知识点,全部都是精华中的精华,我能面试到现在2-2资深开发人员跟我整理的这本Android核心知识点有密不可分的关系,在这里本着共赢的心态分享给各位朋友。

不管是Android基础还是Java基础以及常见的数据结构,这些是无原则地必须要熟练掌握的,尤其是非计算机专业的同学,面试官一上来肯定是问你基础,要是基础表现不好很容易被扣上基础不扎实的帽子,常见的就那些,只要你平时认真思考过基本上面试是没太大问题的。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。

节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

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

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

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

new Retrofit.Builder()

.baseUrl(API_BASE_URL)

.addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create());

public S createService(Class serviceClass) {

Retrofit retrofit = builder.client(client).build();

return retrofit.create(serviceClass);

}

}

NetworkUtils

public class NetworkUtils {

public static final int NETWORK_NO = -1; // no network

public static final int NETWORK_WIFI = 1; // wifi network

public static final int NETWORK_2G = 2; // “2G” networks

public static final int NETWORK_3G = 3; // “3G” networks

public static final int NETWORK_4G = 4; // “4G” networks

public static final int NETWORK_UNKNOWN = 5; // unknown network

private static final int NETWORK_TYPE_GSM = 16;

private static final int NETWORK_TYPE_TD_SCDMA = 17;

private static final int NETWORK_TYPE_IWLAN = 18;

/**

  • 打开网络设置界面

  • 3.0以下打开设置界面

  • @param context 上下文

*/

public static void openWirelessSettings(Context context) {

if (android.os.Build.VERSION.SDK_INT > 10) {

context.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));

} else {

context.startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS));

}

}

/**

  • 获取活动网络信息

  • @param context 上下文

  • @return NetworkInfo

*/

private static NetworkInfo getActiveNetworkInfo(Context context) {

ConnectivityManager cm = (ConnectivityManager) context

.getSystemService(Context.CONNECTIVITY_SERVICE);

return cm.getActiveNetworkInfo();

}

/**

  • 判断网络是否可用

  • 需添加权限 {@code }

  • @param context 上下文

  • @return {@code true}: 可用
    {@code false}: 不可用

*/

public static boolean isAvailable(Context context) {

NetworkInfo info = getActiveNetworkInfo(context);

return info != null && info.isAvailable();

}

/**

  • 判断网络是否连接

  • 需添加权限 {@code }

  • @param context 上下文

  • @return {@code true}: 是
    {@code false}: 否

*/

public static boolean isConnected(Context context) {

NetworkInfo info = getActiveNetworkInfo(context);

return info != null && info.isConnected();

}

/**

  • 判断网络是否是4G

  • 需添加权限 {@code }

  • @param context 上下文

  • @return {@code true}: 是
    {@code false}: 不是

*/

public static boolean is4G(Context context) {

NetworkInfo info = getActiveNetworkInfo(context);

return info != null && info.isAvailable() && info.getSubtype() == TelephonyManager.NETWORK_TYPE_LTE;

}

/**

  • 判断wifi是否连接状态

  • 需添加权限 {@code }

  • @param context 上下文

  • @return {@code true}: 连接
    {@code false}: 未连接

*/

public static boolean isWifiConnected(Context context) {

ConnectivityManager cm = (ConnectivityManager) context

.getSystemService(Context.CONNECTIVITY_SERVICE);

return cm != null && cm.getActiveNetworkInfo() != null

&& cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI;

}

/**

  • 获取移动网络运营商名称

  • 如中国联通、中国移动、中国电信

  • @param context 上下文

  • @return 移动网络运营商名称

*/

public static String getNetworkOperatorName(Context context) {

TelephonyManager tm = (TelephonyManager) context

.getSystemService(Context.TELEPHONY_SERVICE);

return tm != null ? tm.getNetworkOperatorName() : null;

}

/**

  • 获取移动终端类型

  • @param context 上下文

  • @return 手机制式

    • {@link TelephonyManager#PHONE_TYPE_NONE } : 0 手机制式未知
    • {@link TelephonyManager#PHONE_TYPE_GSM } : 1 手机制式为GSM,移动和联通
    • {@link TelephonyManager#PHONE_TYPE_CDMA } : 2 手机制式为CDMA,电信
    • {@link TelephonyManager#PHONE_TYPE_SIP } : 3

    */

    public static int getPhoneType(Context context) {

    TelephonyManager tm = (TelephonyManager) context

    .getSystemService(Context.TELEPHONY_SERVICE);

    return tm != null ? tm.getPhoneType() : -1;

    }

    /**

    • 获取当前的网络类型(WIFI,2G,3G,4G)

    • 需添加权限 {@code }

    • @param context 上下文

    • @return 网络类型

      • {@link #NETWORK_WIFI } = 1;
      • {@link #NETWORK_4G } = 4;
      • {@link #NETWORK_3G } = 3;
      • {@link #NETWORK_2G } = 2;
      • {@link #NETWORK_UNKNOWN} = 5;
      • {@link #NETWORK_NO } = -1;

      */

      public static int getNetWorkType(Context context) {

      int netType = NETWORK_NO;

      NetworkInfo info = getActiveNetworkInfo(context);

      if (info != null && info.isAvailable()) {

      if (info.getType() == ConnectivityManager.TYPE_WIFI) {

      netType = NETWORK_WIFI;

      } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {

      switch (info.getSubtype()) {

      case NETWORK_TYPE_GSM:

      case TelephonyManager.NETWORK_TYPE_GPRS:

      case TelephonyManager.NETWORK_TYPE_CDMA:

      case TelephonyManager.NETWORK_TYPE_EDGE:

      case TelephonyManager.NETWORK_TYPE_1xRTT:

      case TelephonyManager.NETWORK_TYPE_IDEN:

      netType = NETWORK_2G;

      break;

      case NETWORK_TYPE_TD_SCDMA:

      case TelephonyManager.NETWORK_TYPE_EVDO_A:

      case TelephonyManager.NETWORK_TYPE_UMTS:

      case TelephonyManager.NETWORK_TYPE_EVDO_0:

      case TelephonyManager.NETWORK_TYPE_HSDPA:

      case TelephonyManager.NETWORK_TYPE_HSUPA:

      case TelephonyManager.NETWORK_TYPE_HSPA:

      case TelephonyManager.NETWORK_TYPE_EVDO_B:

      case TelephonyManager.NETWORK_TYPE_EHRPD:

      case TelephonyManager.NETWORK_TYPE_HSPAP:

      netType = NETWORK_3G;

      break;

      case NETWORK_TYPE_IWLAN:

      case TelephonyManager.NETWORK_TYPE_LTE:

      netType = NETWORK_4G;

      break;

      default:

      String subtypeName = info.getSubtypeName();

      if (subtypeName.equalsIgnoreCase(“TD-SCDMA”)

      || subtypeName.equalsIgnoreCase(“WCDMA”)

      || subtypeName.equalsIgnoreCase(“CDMA2000”)) {

      netType = NETWORK_3G;

      } else {

      netType = NETWORK_UNKNOWN;

      }

      break;

      }

      } else {

      netType = NETWORK_UNKNOWN;

      }

      }

      return netType;

      }

      /**

      • 获取当前的网络类型(WIFI,2G,3G,4G)

      • 依赖上面的方法

      • @param context 上下文

      • @return 网络类型名称

        • NETWORK_WIFI
        • NETWORK_4G
        • NETWORK_3G
        • NETWORK_2G
        • NETWORK_UNKNOWN
        • NETWORK_NO

        */

        public static String getNetWorkTypeName(Context context) {

        switch (getNetWorkType(context)) {

        case NETWORK_WIFI:

        return “NETWORK_WIFI”;

        case NETWORK_4G:

        return “NETWORK_4G”;

        case NETWORK_3G:

        return “NETWORK_3G”;

        case NETWORK_2G:

        return “NETWORK_2G”;

        case NETWORK_NO:

        return “NETWORK_NO”;

        default:

        return “NETWORK_UNKNOWN”;

        }

        }

        }

        下拉刷新与上拉加载 用的我github上已经描述的XRecylerView

        网络请求实现分页整体代码如下

        public class TestRecylerViewActivity extends AppCompatActivity {

        //初始化组件

        @BindView(R.id.xrlv_recylerview)

        XRecyclerView xrlvRecylerview;

        //第一页

        private int num=1;

        private LinearLayoutManager llm;

        private boolean flag;

        private boolean tag;

        private ListAdapter listAdapter;

        private List<ProductList.DataBean> list;

        /**

        • retrofitService接口

        */

        private RetrofitService rs;

        @Override

        protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_test_recyler_view);

        ButterKnife.bind(this);

        llm=new LinearLayoutManager(this);

        //设置chunzhi垂直布局

        llm.setOrientation(LinearLayoutManager.VERTICAL);

        xrlvRecylerview.setLayoutManager(llm);

        //刷新时间可见

        xrlvRecylerview.getDefaultRefreshHeaderView().setRefreshTimeVisible(true);

        xrlvRecylerview.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);

        xrlvRecylerview.setLoadingMoreProgressStyle(ProgressStyle.SquareSpin);

        //添加横向分割线

        xrlvRecylerview.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));

        //创建Retrofit

        rs=new RetrofitManager(this).createService(RetrofitService.class);

        startHttpRequest(num);

        // xrlvRecylerview.setAdapter(listAdapter);

        xrlvRecylerview.setLoadingListener(new XRecyclerView.LoadingListener() {

        @Override

        public void onRefresh() {

        flag=true;

        num=1;

        startHttpRequest(num);

        }

        @Override

        public void onLoadMore() {

        flag=false;

        num++;

        startHttpRequest(num);

        }

        });

        }

        /**

        • 发起网络请求

        • @param pageNumber

        */

        private void startHttpRequest(int pageNumber){

        rs.getProductList(pageNumber,5).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber() {

        @Override

        public void onCompleted() {

        写在最后

        对程序员来说,很多技术的学习都是“防御性”的。也就是说,我们是在为未来学习。我们学习新技术的目的,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。

        ![
        []


        文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等

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

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

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

        ,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。

        [外链图片转存中…(img-OcdDw2m8-1715269352660)]

        [外链图片转存中…(img-gt8cTmBw-1715269352660)]
        []

        [外链图片转存中…(img-6A8ub4KQ-1715269352661)]
        [外链图片转存中…(img-MjnCgqZ2-1715269352661)]

        文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等

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

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

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

        • 13
          点赞
        • 29
          收藏
          觉得还不错? 一键收藏
        • 0
          评论
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

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

        抵扣说明:

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

        余额充值