HandlerCaller.java revision 22f7dfd23490a3de2f21ff96949ba47003aac8f8
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 obtainMessageI(int what, int arg1) {
119        return mH.obtainMessage(what, arg1, 0);
120    }
121
122    public Message obtainMessageIO(int what, int arg1, Object arg2) {
123        return mH.obtainMessage(what, arg1, 0, arg2);
124    }
125
126    public Message obtainMessageIIO(int what, int arg1, int arg2, Object arg3) {
127        return mH.obtainMessage(what, arg1, arg2, arg3);
128    }
129
130    public Message obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) {
131        SomeArgs args = obtainArgs();
132        args.arg1 = arg2;
133        args.arg2 = arg3;
134        return mH.obtainMessage(what, arg1, 0, args);
135    }
136
137    public Message obtainMessageOO(int what, Object arg1, Object arg2) {
138        SomeArgs args = obtainArgs();
139        args.arg1 = arg1;
140        args.arg2 = arg2;
141        return mH.obtainMessage(what, 0, 0, args);
142    }
143
144    public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) {
145        SomeArgs args = obtainArgs();
146        args.arg1 = arg1;
147        args.arg2 = arg2;
148        args.arg3 = arg3;
149        return mH.obtainMessage(what, 0, 0, args);
150    }
151
152    public Message obtainMessageIIII(int what, int arg1, int arg2,
153            int arg3, int arg4) {
154        SomeArgs args = obtainArgs();
155        args.argi1 = arg1;
156        args.argi2 = arg2;
157        args.argi3 = arg3;
158        args.argi4 = arg4;
159        return mH.obtainMessage(what, 0, 0, args);
160    }
161
162    public Message obtainMessageIIIIII(int what, int arg1, int arg2,
163            int arg3, int arg4, int arg5, int arg6) {
164        SomeArgs args = obtainArgs();
165        args.argi1 = arg1;
166        args.argi2 = arg2;
167        args.argi3 = arg3;
168        args.argi4 = arg4;
169        args.argi5 = arg5;
170        args.argi6 = arg6;
171        return mH.obtainMessage(what, 0, 0, args);
172    }
173
174    public Message obtainMessageIIIIO(int what, int arg1, int arg2,
175            int arg3, int arg4, Object arg5) {
176        SomeArgs args = obtainArgs();
177        args.arg1 = arg5;
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