从内部类访问SplashScreen时出现Unresolved reference: this@SplashScreen错误
问题原因
你的SplashTimerTask是静态内部类(Kotlin中不带inner关键字的内部类默认是静态的),静态内部类不会持有外部SplashScreen实例的引用,所以无法通过this@SplashScreen访问外部Activity。
方案1:使用inner修饰内部类(非静态内部类)
给SplashTimerTask加上inner关键字,让它成为非静态内部类,这样就能持有外部SplashScreen的引用。同时要注意:TimerTask的run方法运行在后台线程,启动Activity必须切换到主线程执行:
class SplashScreen : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash_screen) verifyPermissions() // 示例:启动延迟任务 Timer().schedule(SplashTimerTask(), 2000) } // 添加inner关键字,转为非静态内部类 private inner class SplashTimerTask : TimerTask() { override fun run() { // 切换到主线程执行Activity操作 runOnUiThread { val mainIntent = Intent(this@SplashScreen, LoginActivity::class.java) startActivity(mainIntent) finish() } } } }
方案2:给内部类传入外部Activity引用
如果不想用非静态内部类(避免潜在的内存泄漏风险),可以在创建SplashTimerTask时传入SplashScreen的实例,内部类保存这个引用后直接使用:
class SplashScreen : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash_screen) verifyPermissions() // 创建Task时传入当前Activity实例 Timer().schedule(SplashTimerTask(this), 2000) } private class SplashTimerTask(private val activity: SplashScreen) : TimerTask() { override fun run() { activity.runOnUiThread { val mainIntent = Intent(activity, LoginActivity::class.java) startActivity(mainIntent) activity.finish() } } } }
额外注意事项
- 内存泄漏防范:如果使用非静态内部类,当TimerTask仍在运行时Activity被销毁,可能会导致内存泄漏。可以用
WeakReference包装Activity引用,或者改用Coroutine、Handler等更适配Android的延迟方案。 - 主线程约束:所有涉及Activity的操作(如
startActivity、finish)必须在主线程执行,务必通过runOnUiThread切换线程。
内容的提问来源于stack exchange,提问作者Ameena Shafeer
相关产品推荐
相关产品推荐

