我正在使用 Google 的 DrawerLayout
。
当一个项目被点击时,抽屉会平滑地关闭,然后启动一个 Activity
。将这些活动转换为 Fragment
不是一个选项。因此,启动一个活动,然后关闭抽屉也不是一个选项。同时关闭抽屉和启动活动会使关闭动画卡顿。
考虑到我想先平滑地关闭它,然后再启动活动,我遇到了一个问题,即用户单击抽屉项目时,看到他们想要去的活动之间存在延迟。
每个项目的点击监听器如下所示。
final View.OnClickListener mainItemClickListener = new View.OnClickListener() {
@Override
public void onClick(final View v) {
mViewToLaunch = v;
mDrawerLayout.closeDrawers();
}
};
我的活动也是DrawerListener,它的onDrawerClosed
方法如下:
@Override
public synchronized void onDrawerClosed(final View view) {
if (mViewToLaunch != null) {
onDrawerItemSelection(mViewToLaunch);
mViewToLaunch = null;
}
}
onDrawerItemSelection
只是启动五个活动中的一个。
在DrawerActivity
的onPause
上我什么也不做。
我正在进行仪器测试,从onClick被调用到onDrawerClosed结束平均需要500-650毫秒。
抽屉关闭后,在对应的活动启动之前会有明显的延迟。
我意识到有几件事情正在发生:
关闭动画会发生,这就是几毫秒的时间(假设300)。
然后可能存在一些延迟,即抽屉视觉上关闭和其监听器被触发之间的延迟。我正试图通过查看DrawerLayout源代码来确定这些时间的确切差异,但我还没有想清楚。
然后是启动的活动执行其启动生命周期方法直至(包括)
onResume
所需的时间。我还没有对此进行仪器测试,但我估计需要大约200-300毫秒。
这似乎是一个走错路线会非常昂贵的问题,所以我想确保我完全理解它。
一个解决方案是跳过关闭动画,但我希望保留它。
如何尽可能缩短我的转换时间?
Handler.postAtFrontOfQueue(Runnable)
在onDrawerClosed()
回调中发布一个启动活动的Runnable
。 - useronDrawerClosed()
,我认为postAtFrontOfQueue
无法解决这个问题。但我会尝试两种方法并回报结果。 - yarian