笔试题总结 +(知识点整理)【一】

1.  下面哪儿不属于Activity的launchMode?(A)

A、single

B、singleTop

C、singleTask

D、singleInstance

知识点:Activity的四种加载模式:

  • standard
  • singleTop
  • singleTask
  • singleInstance

配置加载模式的位置早在AndroidManifest.xml文件中activity元素的launchMode属性:

<activity android:launchMode** = "singleTask"></activity>

standard,即默认模式,不需要进行配置launchMode。就是每次跳转的时候都需要创建该Activity的新实例,点击返回键可以看到按照刚才创建的activity实例的倒序依次出现,类似退栈的操作,而刚才跳转的操作就是压栈的操作。

singleTop,如果启动的activity已经位于栈顶,那么就不会重新创建一个新的activity实例。而是复用位于栈顶activity实例对象,如果不位于栈顶仍旧会创建activity实例对象。

singleTask,设置了singleTask启动模式的activity在启动时,如果位于activity中,就会复用该activity,这样的话,在该实例之上的所有activity依次进行出栈操作,即执行其对应的onDestroy()方法,直到当前要启动的activity位于栈顶。

singleInstance,设置了singleInstance启动模式的activity在启动时会复用已经启动的activity实例对象,使用了singleInstance的启动模式的activity会单独开启一个共享栈,这个栈中存在当前的activity实例对象。

2.  关于Handler的说法正确的是(A)

A、它实现不同线程间通信的一种机制

B、它不能在新线程中执行刷新UI的操作

C、它采用栈的方式来组织任务的

D、它可以属于一个新的线程

知识点:Handler主要接受子线程发送的数据,并用此数据配合主线程更新UI。

解释:当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示  "强制关闭"。这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,,Android主线程是线程不安全的, 也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。 这个时候,Handler就出现了。,来解决这个复杂的问题 ,由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

Handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建它的线程中,有两个作用:

  1. 安排消息或Runnable在某个主线程中某个地方执行。
  2. 安排一个动作在不同的线程中执行。

3.  Intent传递数据时,下面的数据类型不可以被传递的是?(D)

A、Serializable

B、File

C、Parcelable

D、Thread

知识点:

Intent可以传递的数据类型有:

1.  8种基本数据类型及其数组。

2.  String(String实现了Serializable)/CharSequence实例类型的数据及其数组。

3.  实现了Parcelable的对象及其数组【自己完成,操作复杂,但速度快】。

4.  实现了Serializable的对象及其数组【系统完成,操作简单,但速度慢】。

File在Java里面也是类,在Android里也实现了serializable接口。

4.  下列对AsyncTask的描述,哪些是正确的?(ABC)

A、onProgressUpdate()方法是在主线程中执行的。【在非主线程中操作UI将会报错】

B、如果同时执行多个AsyncTask的话,它们默认是串行执行。

C、AsyncTask的实例应在UI thread中创建实例。

D、AsyncTask内部磨人的线池也是通过java.util.concurrentExecuttors.newFixedThreadPool创建的。

    【内部默认的线程是由 SerialExecutor创建】

知识点:

AsyncTask中有两个线程池,一个是SerialExecutor 一个是 threadPoolExecutor,它们的区别在于,第一个线程池用于排队,第二个线程池用于执行指定的任务,在最初的 AsyncTask 中只支持串行工作,后在3.0之后加入了executeOnExecutor方法,该方法提供并行了并行操作,一般而言用法为 :new AsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"...");

发布了50 篇原创文章 · 获赞 37 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/m0_37868230/article/details/81188996