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