HandlerCaller.java revision 8df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bd
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 boolean hasMessages(int what) {
97        return mH.hasMessages(what);
98    }
99
100    public void removeMessages(int what) {
101        mH.removeMessages(what);
102    }
103
104    public void removeMessages(int what, Object obj) {
105        mH.removeMessages(what, obj);
106    }
107
108    public void sendMessage(Message msg) {
109        mH.sendMessage(msg);
110    }
111
112    public Message obtainMessage(int what) {
113        return mH.obtainMessage(what);
114    }
115
116    public Message obtainMessageBO(int what, boolean arg1, Object arg2) {
117        return mH.obtainMessage(what, arg1 ? 1 : 0, 0, arg2);
118    }
119
120    public Message obtainMessageBOO(int what, boolean arg1, Object arg2, Object arg3) {
121        SomeArgs args = obtainArgs();
122        args.arg1 = arg2;
123        args.arg2 = arg3;
124        return mH.obtainMessage(what, arg1 ? 1 : 0, 0, args);
125    }
126
127    public Message obtainMessageO(int what, Object arg1) {
128        return mH.obtainMessage(what, 0, 0, arg1);
129    }
130
131    public Message obtainMessageI(int what, int arg1) {
132        return mH.obtainMessage(what, arg1, 0);
133    }
134
135    public Message obtainMessageII(int what, int arg1, int arg2) {
136        return mH.obtainMessage(what, arg1, arg2);
137    }
138
139    public Message obtainMessageIO(int what, int arg1, Object arg2) {
140        return mH.obtainMessage(what, arg1, 0, arg2);
141    }
142
143    public Message obtainMessageIIO(int what, int arg1, int arg2, Object arg3) {
144        return mH.obtainMessage(what, arg1, arg2, arg3);
145    }
146
147    public Message obtainMessageIIOO(int what, int arg1, int arg2,
148            Object arg3, Object arg4) {
149        SomeArgs args = obtainArgs();
150        args.arg1 = arg3;
151        args.arg2 = arg4;
152        return mH.obtainMessage(what, arg1, arg2, args);
153    }
154
155    public Message obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) {
156        SomeArgs args = obtainArgs();
157        args.arg1 = arg2;
158        args.arg2 = arg3;
159        return mH.obtainMessage(what, arg1, 0, args);
160    }
161
162    public Message obtainMessageOO(int what, Object arg1, Object arg2) {
163        SomeArgs args = obtainArgs();
164        args.arg1 = arg1;
165        args.arg2 = arg2;
166        return mH.obtainMessage(what, 0, 0, args);
167    }
168
169    public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) {
170        SomeArgs args = obtainArgs();
171        args.arg1 = arg1;
172        args.arg2 = arg2;
173        args.arg3 = arg3;
174        return mH.obtainMessage(what, 0, 0, args);
175    }
176
177    public Message obtainMessageOOOO(int what, Object arg1, Object arg2,
178            Object arg3, Object arg4) {
179        SomeArgs args = obtainArgs();
180        args.arg1 = arg1;
181        args.arg2 = arg2;
182        args.arg3 = arg3;
183        args.arg4 = arg4;
184        return mH.obtainMessage(what, 0, 0, args);
185    }
186
187    public Message obtainMessageIIII(int what, int arg1, int arg2,
188            int arg3, int arg4) {
189        SomeArgs args = obtainArgs();
190        args.argi1 = arg1;
191        args.argi2 = arg2;
192        args.argi3 = arg3;
193        args.argi4 = arg4;
194        return mH.obtainMessage(what, 0, 0, args);
195    }
196
197    public Message obtainMessageIIIIII(int what, int arg1, int arg2,
198            int arg3, int arg4, int arg5, int arg6) {
199        SomeArgs args = obtainArgs();
200        args.argi1 = arg1;
201        args.argi2 = arg2;
202        args.argi3 = arg3;
203        args.argi4 = arg4;
204        args.argi5 = arg5;
205        args.argi6 = arg6;
206        return mH.obtainMessage(what, 0, 0, args);
207    }
208
209    public Message obtainMessageIIIIO(int what, int arg1, int arg2,
210            int arg3, int arg4, Object arg5) {
211        SomeArgs args = obtainArgs();
212        args.arg1 = arg5;
213        args.argi1 = arg1;
214        args.argi2 = arg2;
215        args.argi3 = arg3;
216        args.argi4 = arg4;
217        return mH.obtainMessage(what, 0, 0, args);
218    }
219}
220