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