DeferredHandler.java revision 9c1289cb3bfb74f86e53ec7ac6dd76bb39666b2d
19c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato/* 29c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Copyright (C) 2008 The Android Open Source Project 39c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 49c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 59c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * you may not use this file except in compliance with the License. 69c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * You may obtain a copy of the License at 79c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 89c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * http://www.apache.org/licenses/LICENSE-2.0 99c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 109c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Unless required by applicable law or agreed to in writing, software 119c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 129c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * See the License for the specific language governing permissions and 149c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * limitations under the License. 159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 179c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratopackage com.android.launcher2; 189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.os.Handler; 209c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.os.Looper; 219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.os.Message; 229c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.os.MessageQueue; 239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.util.Log; 249c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 259c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport java.util.LinkedList; 269c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato/** 289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Queue of things to run on a looper thread. Items posted with {@link #post} will not 299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * be actually enqued on the handler until after the last one has run, to keep from 309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * starving the thread. 319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * 329c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * This class is fifo. 339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 349c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratopublic class DeferredHandler { 359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private LinkedList<Runnable> mQueue = new LinkedList(); 369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private MessageQueue mMessageQueue = Looper.myQueue(); 379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private Impl mHandler = new Impl(); 389c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private class Impl extends Handler implements MessageQueue.IdleHandler { 409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void handleMessage(Message msg) { 419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato Runnable r; 429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato synchronized (mQueue) { 439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato r = mQueue.removeFirst(); 449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato r.run(); 469c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato synchronized (mQueue) { 479c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato scheduleNextLocked(); 489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 509c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 519c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public boolean queueIdle() { 529c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato handleMessage(null); 539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return false; 549c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 569c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 579c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private class IdleRunnable implements Runnable { 589c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato Runnable mRunnable; 599c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 609c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato IdleRunnable(Runnable r) { 619c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mRunnable = r; 629c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 639c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 649c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void run() { 659c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mRunnable.run(); 669c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 689c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public DeferredHandler() { 709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 719c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** Schedule runnable to run after everything that's on the queue right now. */ 739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void post(Runnable runnable) { 749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato synchronized (mQueue) { 759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mQueue.add(runnable); 769c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (mQueue.size() == 1) { 779c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato scheduleNextLocked(); 789c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 799c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 809c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 819c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 829c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** Schedule runnable to run when the queue goes idle. */ 839c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void postIdle(final Runnable runnable) { 849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato post(new IdleRunnable(runnable)); 859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void cancel() { 889c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato synchronized (mQueue) { 899c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mQueue.clear(); 909c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 929c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 939c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato void scheduleNextLocked() { 949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (mQueue.size() > 0) { 959c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato Runnable peek = mQueue.getFirst(); 969c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (peek instanceof IdleRunnable) { 979c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mMessageQueue.addIdleHandler(mHandler); 989c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } else { 999c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mHandler.sendEmptyMessage(1); 1009c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 1019c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 1029c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 1039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato} 1049c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 105