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