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