Android UI测试前清除SharedPreferences无效,如何避免Thread.sleep?
你的问题核心是启动Activity的时机不对——你先启动了HomeActivity,然后才去清除SharedPreferences,这时候Activity已经完成初始化并读取了SP里的数据,所以后续的清除操作对已经加载的Activity状态没有影响,自然看不到效果。而Thread.sleep()能“生效”只是碰巧让系统有时间完成某些异步操作,但这是非常不可靠的方案,完全没必要依赖它。
下面是几个更优的解决方案:
方案1:调整执行顺序(最推荐)
在启动ActivityScenario之前就清除SharedPreferences,这样Activity启动时读取的就是清空后的SP数据:
@Before fun setUp() { IdlingRegistry.getInstance().register(EspressoIdlingResource.countingIdlingResource) // 先清除SP,再启动Activity InstrumentationRegistry.getInstrumentation().targetContext.clearSharedPrefs() activityScenario = ActivityScenario.launch(HomeActivity::class.java) }
方案2:清除后重启Activity(适用于必须先启动Activity的场景)
如果你的测试流程需要先启动Activity再清除SP,那清除后需要重启Activity,让它重新读取最新的SP数据:
fun clearAndRestartActivity() { InstrumentationRegistry.getInstrumentation().targetContext.clearSharedPrefs() // 重启Activity activityScenario.recreate() // 可选:利用onActivity回调确保Activity就绪后再执行测试 activityScenario.onActivity { activity -> // 这里可以添加Activity就绪的检查逻辑 } }
方案3:确保SP操作在正确线程执行
虽然commit()是同步操作,但测试环境中线程调度可能有异常,你可以通过Instrumentation确保清除操作在主线程执行:
fun Context.clearSharedPrefs() { InstrumentationRegistry.getInstrumentation().runOnMainSync { this.getSharedPreferences("name", Context.MODE_PRIVATE).edit().clear().commit() } }
额外检查点
- 确认你要清除的SP文件名
"name"完全正确,很多时候问题只是文件名拼写错误; - 如果你的App用了默认SP(通过
getPreferences(Context.MODE_PRIVATE)获取),文件名其实是当前Activity的类名,需要对应修改清除逻辑,或者精准定位目标SP文件。
内容的提问来源于stack exchange,提问作者rupesh
相关产品推荐
相关产品推荐

