面试题答案
一键面试对象生命周期理解
在Android开发中,Activity、Fragment等组件都有自己的生命周期。例如Activity,从启动(onCreate)、可见(onStart)、可交互(onResume),到失去焦点(onPause)、不可见(onStop),最后销毁(onDestroy)。Kotlin中通过扩展函数等方式可以方便地在这些生命周期方法中处理业务逻辑。比如在Activity的onCreate方法中初始化视图和数据,在onDestroy中释放资源。
内存回收机制理解
Android使用的是基于标记 - 清除算法的垃圾回收机制。当一个对象没有任何引用指向它时,垃圾回收器会标记该对象,然后在合适的时机将其内存回收。例如,当一个Activity被销毁,如果没有外部强引用持有其内部的对象,这些对象将有机会被回收。
避免内存泄漏
- 避免静态引用持有Activity或Context:
class MyClass {
private var context: Context? = null
constructor(context: Context) {
this.context = context
}
// 这里context使用弱引用,避免Activity销毁后,MyClass还持有其强引用导致内存泄漏
constructor(context: Context) {
this.context = WeakReference(context).get()
}
}
- 及时取消注册监听: 在Android中,经常需要注册一些监听,如广播接收器、传感器监听等。在组件销毁时,要及时取消注册。
class MainActivity : AppCompatActivity() {
private lateinit var sensorManager: SensorManager
private lateinit var sensorListener: SensorEventListener
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
sensorListener = object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
// 处理传感器数据变化
}
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
// 处理传感器精度变化
}
}
sensorManager.registerListener(sensorListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL)
}
override fun onDestroy() {
super.onDestroy()
sensorManager.unregisterListener(sensorListener)
}
}
- 使用弱引用: 当需要持有一个可能会被销毁的对象引用时,使用弱引用。比如在图片加载框架中,避免图片加载任务持有Activity的强引用。
class ImageLoader {
private val weakActivityRef: WeakReference<Activity?>
constructor(activity: Activity) {
weakActivityRef = WeakReference(activity)
}
fun loadImage(url: String) {
val activity = weakActivityRef.get()
if (activity != null &&!activity.isFinishing) {
// 加载图片并显示在Activity的ImageView上
}
}
}
Kotlin中主动管理对象回收
在Kotlin中,虽然开发者一般不需要主动管理对象回收,但在一些特定场景下,可以通过取消引用等方式促使对象被回收。例如,当一个对象不再需要使用时,将其赋值为null
,使其失去强引用。
var myObject: MyClass? = MyClass()
// 使用myObject进行一些操作
myObject = null // 取消对MyClass对象的引用,使其有机会被垃圾回收器回收
另外,在Kotlin中,use
函数可以用于自动关闭实现了Closeable
接口的资源,在资源使用完毕后释放资源,间接有助于内存回收。
File("example.txt").bufferedReader().use { reader ->
val text = reader.readText()
// 这里使用完reader后,reader会自动关闭,释放资源
}