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