HandlerThread.java revision 7f9f99ea11051614a7727dfb9f9578b518e76e3c
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handy class for starting a new thread that has a looper. The looper can then be 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used to create handler classes. Note that start() must still be called. 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class HandlerThread extends Thread { 247f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet int mPriority; 257f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet int mTid = -1; 267f9f99ea11051614a7727dfb9f9578b518e76e3cXavier Ducrohet Looper mLooper; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public HandlerThread(String name) { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(name); 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPriority = Process.THREAD_PRIORITY_DEFAULT; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructs a HandlerThread. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param priority The priority to run the thread at. The value supplied must be from 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.Process} and not from java.lang.Thread. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public HandlerThread(String name, int priority) { 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(name); 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPriority = priority; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call back method that can be explicitly over ridden if needed to execute some 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setup before Looper loops. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onLooperPrepared() { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTid = Process.myTid(); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.prepare(); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLooper = Looper.myLooper(); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAll(); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859bac03b280115ba843b540298dfb2fbc20491afChih-Chung Chang Process.setThreadPriority(mPriority); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onLooperPrepared(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Looper.loop(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTid = -1; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method returns the Looper associated with this thread. If this thread not been started 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or for any reason is isAlive() returns false, this method will return null. If this thread 6719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * has been started, this method will block until the looper has been initialized. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The looper. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Looper getLooper() { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isAlive()) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the thread has been started, wait until the looper has been created. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (isAlive() && mLooper == null) { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wait(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLooper; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * Ask the currently running looper to quit. If the thread has not 8919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * been started or has finished (that is if {@link #getLooper} returns 9019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * null), then false is returned. Otherwise the looper is asked to 9119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn * quit and true is returned. 9219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn */ 9319382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn public boolean quit() { 9419382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn Looper looper = getLooper(); 9519382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn if (looper != null) { 9619382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn looper.quit(); 9719382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn return true; 9819382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 9919382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn return false; 10019382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn } 10119382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn 10219382ac1a4e4e7c23a1346d299368763f149de9cDianne Hackborn /** 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the identifier of this thread. See Process.myTid(). 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getThreadId() { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTid; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 109