HandlerCaller.java revision 4c62fc0e1e5ea9c69a12a7d1cf8b3ec8b2d114a3
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 obtainMessageIIOO(int what, int arg1, int arg2,
136            Object arg3, Object arg4) {
137        SomeArgs args = obtainArgs();
138        args.arg1 = arg3;
139        args.arg2 = arg4;
140        return mH.obtainMessage(what, arg1, arg2, args);
141    }
142
143    public Message obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) {
144        SomeArgs args = obtainArgs();
145        args.arg1 = arg2;
146        args.arg2 = arg3;
147        return mH.obtainMessage(what, arg1, 0, args);
148    }
149
150    public Message obtainMessageOO(int what, Object arg1, Object arg2) {
151        SomeArgs args = obtainArgs();
152        args.arg1 = arg1;
153        args.arg2 = arg2;
154        return mH.obtainMessage(what, 0, 0, args);
155    }
156
157    public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) {
158        SomeArgs args = obtainArgs();
159        args.arg1 = arg1;
160        args.arg2 = arg2;
161        args.arg3 = arg3;
162        return mH.obtainMessage(what, 0, 0, args);
163    }
164
165    public Message obtainMessageOOOO(int what, Object arg1, Object arg2,
166            Object arg3, Object arg4) {
167        SomeArgs args = obtainArgs();
168        args.arg1 = arg1;
169        args.arg2 = arg2;
170        args.arg3 = arg3;
171        args.arg4 = arg4;
172        return mH.obtainMessage(what, 0, 0, args);
173    }
174
175    public Message obtainMessageIIII(int what, int arg1, int arg2,
176            int arg3, int arg4) {
177        SomeArgs args = obtainArgs();
178        args.argi1 = arg1;
179        args.argi2 = arg2;
180        args.argi3 = arg3;
181        args.argi4 = arg4;
182        return mH.obtainMessage(what, 0, 0, args);
183    }
184
185    public Message obtainMessageIIIIII(int what, int arg1, int arg2,
186            int arg3, int arg4, int arg5, int arg6) {
187        SomeArgs args = obtainArgs();
188        args.argi1 = arg1;
189        args.argi2 = arg2;
190        args.argi3 = arg3;
191        args.argi4 = arg4;
192        args.argi5 = arg5;
193        args.argi6 = arg6;
194        return mH.obtainMessage(what, 0, 0, args);
195    }
196
197    public Message obtainMessageIIIIO(int what, int arg1, int arg2,
198            int arg3, int arg4, Object arg5) {
199        SomeArgs args = obtainArgs();
200        args.arg1 = arg5;
201        args.argi1 = arg1;
202        args.argi2 = arg2;
203        args.argi3 = arg3;
204        args.argi4 = arg4;
205        return mH.obtainMessage(what, 0, 0, args);
206    }
207}
208