美文网首页面试那些事
Android面试题1(通关1)

Android面试题1(通关1)

作者: 阿迪scar | 来源:发表于2019-05-29 21:19 被阅读49次

    1:登录注册逻辑

    简单的总结了现在市场上最广泛使用的三种登录注册逻辑:

    (1)第一次进入程序不需要登录,直接进入主页面,直到用户启动与用户相关功能时才启动:

    1:跳转登录界面,用户若是老用户可以直接登录,如果是新用户可以点击跳转注册页面: (1)选择手机号注册输入手机号码然后获取验证码,然后验证并绑定手机号码.(2)选择第三方登录,例如qq微信等,获取用户在第三方的信息,传递到自己服务器上并注册一个用户,随后提示用户绑定手机号码.

    (2)用户刚进页面就进入登录界面,不登录的话不能进入主页面:

    1:跳转登录界面,用户若是老用户可以直接登录,如果是新用户可以点击跳转注册页面: (1)选择手机号注册输入手机号码然后获取验证码,然后验证并绑定手机号码.(2)选择第三方登录,例如qq微信等,获取用户在第三方的信息,传递到自己服务器上并注册一个用户,随后提示用户绑定手机号码.

    (3)一上来就进入登录界面,但可以选择类似于"随便逛逛"的功能,跳过登录环节.随后再选择登录操作.

    2: 几种加密方法概念,使用及区别

    1:非对称加密:加密和解密使用的是不同的密钥,通过非对称算法实现.

    2:对称加密:加密和解密使用的密钥一致,通过对称算法实现.

    3:信息摘要:通过一个算法使固定数据产生一个特定的信息摘要

    3:Handler应用场景:

    1:简单的消息发送,不需要实时显示的功能,比如弹出提示信息,更新UI等,可以在主线程使用Handler,主线程或子线程里发送消息,或延迟发送消息更新UI等.

    2:在一个子线程中去创建一个Handler,然后使用这个handler实例在任何其他线程中发送消息,最终处理消息的代码都会在你创建Handler实例的线程中运行

    3:定时器:

    4:Handler原理:

    在Android中,主线程不建议做耗时的操作,子线程不建议跟新UI,但是Android开发,其实就是搭建好页面,将服务器的数据展示到页面上,所以网络请求使用会非常频繁,而网络请求属于耗时操作,需要放到子线程完成,但一般情况下也不会通过子线程更新UI,需要将请求成功的数据发送到主线程进行UI更新,所以一般会使用到handler。

     首先handler作为任务执行者,一般创建在主线程,Handler创建完成后,内部的Looper以及MessageQueue就可以和Handler一起协同工作, 然后通过Handler的post方法将一个Runnable投递到Handler内部的Looper中去处理,也可以通过Handler的send方法发送一个消息,这个消息会在Looper中做处理。 Post最终也是通过send来完成的。当Handler的send方法被调用时, 他会调用MessageQueue的enqueueMessage方法将这个消息放入消息队列中, 然后Looper发现有新消息到来时,就会处理这个消息, 最终消息中的Runnable或者Handler的handlerMessage方法就会被调用。 Looper试运行在Handler所在的线程,所以就把业务逻辑切换到主线程了.

    当子线程有需要发送的数据,通过创建message对象,使用handler对象将消息发送到messagequeue,messagequeue遵循了队列先进先出的原则,当主线程的looper循环消息的时候,会按照messagequeue队列的顺序循环消息,并将消息给到任务执行者handler去执行任务。

    5:Handler的HandlerThread,ThreadLocal:

    HandlerThread:

    HandlerThread是Thread的一个子类,HandlerThread自带Looper使他可以通过消息队列来重复使用当前线程,节省系统资源开销。这是它的优点也是缺点,每一个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。当我们使用HandlerThread创建一个线程,它statr()之后会在它的线程创建一个Looper对象且初始化了一个MessageQueue(消息队列),通过Looper对象在他的线程构建一个Handler对象,然后我们通过Handler发送消息的形式将任务发送到MessageQueue中,因为Looper是顺序处理消息的,所以当有多个任务存在时就会顺序的排队执行。当我们不使用的时候我们应该调用它的quit()或者quitSafely()来终止它的循环。

    ThreadLocal:

    (1)定义:ThreadLocal是线程内部的数据存储类,通过他可以在指定的线程中存储数据,该数据只有在指定线程中可以获取

    (2)使用场景:当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候另外还可以使用在复杂逻辑下的对象传递,比如监听器的传递ThreadLoal的值在table数组中的存储位置总是为ThreadLocal的reference字段所标识的对象的下一个位置。ThreasdLoacal的set和get方法所操作的对象都是当前线程的localValues对象的table数组,因此在不同的线程中访问同一个ThreadLocal的set和get方法,他们对ThreadLocal所做的读写操作仅限于各自线程的内部,从而实现在多个线程中互不干扰的存储和修改数据。 (多线程安全问题的产生是因为多个线程访问同一变量,使用ThreadLocal可以解决这一问题; ThreadLocal.set(“内容”),是给当前线程设置内容,保存变量到当前线程,其他线程无法使用,ThreadLocal.get();得到当前线程的内容.)

    相关文章

      网友评论

        本文标题:Android面试题1(通关1)

        本文链接:https://www.haomeiwen.com/subject/xrrutctx.html