HandlerCaller.java revision b798689749c64baba81f02e10cf2157c747d6b46
1package com.android.internal.os;
2
3import android.content.Context;
4import android.os.Handler;
5import android.os.Looper;
6import android.os.Message;
7
8public class HandlerCaller {
9    private static final String TAG = "HandlerCaller";
10    private static final boolean DEBUG = false;
11
12    public final Context mContext;
13
14    final Looper mMainLooper;
15    final Handler mH;
16
17    final Callback mCallback;
18
19    public static class SomeArgs {
20        SomeArgs next;
21
22        public Object arg1;
23        public Object arg2;
24        Object arg3;
25        public int argi1;
26        public int argi2;
27        public int argi3;
28        public int argi4;
29        public int argi5;
30        public int argi6;
31    }
32
33    static final int ARGS_POOL_MAX_SIZE = 10;
34    int mArgsPoolSize;
35    SomeArgs mArgsPool;
36
37    class MyHandler extends Handler {
38        MyHandler(Looper looper) {
39            super(looper);
40        }
41
42        @Override
43        public void handleMessage(Message msg) {
44            mCallback.executeMessage(msg);
45        }
46    }
47
48    public interface Callback {
49        public void executeMessage(Message msg);
50    }
51
52    public HandlerCaller(Context context, Callback callback) {
53        mContext = context;
54        mMainLooper = context.getMainLooper();
55        mH = new MyHandler(mMainLooper);
56        mCallback = callback;
57    }
58
59    public SomeArgs obtainArgs() {
60        synchronized (mH) {
61            SomeArgs args = mArgsPool;
62            if (args != null) {
63                mArgsPool = args.next;
64                args.next = null;
65                mArgsPoolSize--;
66                return args;
67            }
68        }
69        return new SomeArgs();
70    }
71
72    public void recycleArgs(SomeArgs args) {
73        synchronized (mH) {
74            if (mArgsPoolSize < ARGS_POOL_MAX_SIZE) {
75                args.next = mArgsPool;
76                mArgsPool = args;
77                mArgsPoolSize++;
78            }
79        }
80    }
81
82    public void executeOrSendMessage(Message msg) {
83        // If we are calling this from the main thread, then we can call
84        // right through.  Otherwise, we need to send the message to the
85        // main thread.
86        if (Looper.myLooper() == mMainLooper) {
87            mCallback.executeMessage(msg);
88            msg.recycle();
89            return;
90        }
91
92        mH.sendMessage(msg);
93    }
94
95    public void sendMessage(Message msg) {
96        mH.sendMessage(msg);
97    }
98
99    public Message obtainMessage(int what) {
100        return mH.obtainMessage(what);
101    }
102
103    public Message obtainMessageBO(int what, boolean arg1, Object arg2) {
104        return mH.obtainMessage(what, arg1 ? 1 : 0, 0, arg2);
105    }
106
107    public Message obtainMessageBOO(int what, boolean arg1, Object arg2, Object arg3) {
108        SomeArgs args = obtainArgs();
109        args.arg1 = arg2;
110        args.arg2 = arg3;
111        return mH.obtainMessage(what, arg1 ? 1 : 0, 0, args);
112    }
113
114    public Message obtainMessageO(int what, Object arg1) {
115        return mH.obtainMessage(what, 0, 0, arg1);
116    }
117
118    public Message obtainMessageIO(int what, int arg1, Object arg2) {
119        return mH.obtainMessage(what, arg1, 0, arg2);
120    }
121
122    public Message obtainMessageIO(int what, int arg1, int arg2, Object arg3) {
123        return mH.obtainMessage(what, arg1, arg2, arg3);
124    }
125
126    public Message obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) {
127        SomeArgs args = obtainArgs();
128        args.arg1 = arg2;
129        args.arg2 = arg3;
130        return mH.obtainMessage(what, arg1, 0, args);
131    }
132
133    public Message obtainMessageOO(int what, Object arg1, Object arg2) {
134        SomeArgs args = obtainArgs();
135        args.arg1 = arg1;
136        args.arg2 = arg2;
137        return mH.obtainMessage(what, 0, 0, args);
138    }
139
140    public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) {
141        SomeArgs args = obtainArgs();
142        args.arg1 = arg1;
143        args.arg2 = arg2;
144        args.arg3 = arg3;
145        return mH.obtainMessage(what, 0, 0, args);
146    }
147
148    public Message obtainMessageIIII(int what, int arg1, int arg2,
149            int arg3, int arg4) {
150        SomeArgs args = obtainArgs();
151        args.argi1 = arg1;
152        args.argi2 = arg2;
153        args.argi3 = arg3;
154        args.argi4 = arg4;
155        return mH.obtainMessage(what, 0, 0, args);
156    }
157
158    public Message obtainMessageIIIIII(int what, int arg1, int arg2,
159            int arg3, int arg4, int arg5, int arg6) {
160        SomeArgs args = obtainArgs();
161        args.argi1 = arg1;
162        args.argi2 = arg2;
163        args.argi3 = arg3;
164        args.argi4 = arg4;
165        args.argi5 = arg5;
166        args.argi6 = arg6;
167        return mH.obtainMessage(what, 0, 0, args);
168    }
169
170    public Message obtainMessageIIIIO(int what, int arg1, int arg2,
171            int arg3, int arg4, Object arg5) {
172        SomeArgs args = obtainArgs();
173        args.arg1 = arg5;
174        args.argi1 = arg1;
175        args.argi2 = arg2;
176        args.argi3 = arg3;
177        args.argi4 = arg4;
178        return mH.obtainMessage(what, 0, 0, args);
179    }
180}
181