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