Я использую Google DrawerLayout
.
При щелчке по элементу ящик плавно закрывается и запускается Activity
. Превратить эти действия в Fragment
s — не вариант. Из-за этого запуск активности, а затем закрытие ящика также не вариант. Закрытие ящика и одновременный запуск активности приведет к заиканию анимации закрытия.
Учитывая, что я хочу сначала плавно закрыть его, а затем запустить действие, у меня есть проблема с задержкой между тем, когда пользователь нажимает на элемент ящика, и когда он видит действие, к которому он хотел перейти.
Вот как выглядит прослушиватель кликов для каждого элемента.
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
просто запускает одно из пяти действий.
Я ничего не делаю на onPause
из DrawerActivity
.
Я инструментирую это, и в среднем это занимает от 500 до 650 мс с момента вызова onClick до момента завершения onDrawerClosed.
Существует заметная задержка после закрытия ящика перед запуском соответствующей активности.
Я понимаю, что происходит несколько вещей:
Происходит анимация закрытия, а это тут же пара миллисекунд (скажем, 300).
Тогда, вероятно, есть некоторая задержка между визуальным закрытием ящика и запуском его слушателя. Я пытаюсь выяснить, сколько именно из этого происходит просмотрев
DrawerLayout
источник, но пока не разобрался.Затем есть количество времени, которое требуется запущенной активности для выполнения своих методов жизненного цикла запуска до
onResume
включительно. Я еще не инструментировал это, но я оцениваю около 200-300 мс.
Это похоже на проблему, когда идти по неправильному пути будет довольно дорого, поэтому я хочу убедиться, что полностью понимаю это.
Одно из решений — просто пропустить анимацию закрытия, но я надеялся оставить ее.
Как максимально сократить время перехода?
onDrawerSlide()
следующим образом: gist.github.com/luksprog/6316295 , я не знаю, сколько это вас спасет. Кроме того, что вы делаете вscheduleLaunchAndCloseDrawer(v);
и вonPause()
активности ящика? - person user   schedule 23.08.2013Handler.postAtFrontOfQueue(Runnable)
для публикацииRunnable
запуска действия в обратном вызовеonDrawerClosed()
. - person user   schedule 23.08.2013onDrawerClosed()
, что, я думаю,postAtFrontOfQueue
не поможет исправить. Но я сделаю оба выстрела и отчитаюсь. - person yarian   schedule 24.08.2013onDrawerClosed
, который был большой причиной задержки. Это решение отлично сработало бы, если быonDrawerClosed
вызывался сразу, но в цикле событий было много вещей, но в данном случае это не было большой проблемой. Смотрите ответ для более подробной информации. - person yarian   schedule 27.08.2013