HandlerCaller.java revision 4df2423a947bcd3f024cc3d3a1a315a8dc428598
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 obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) { 136 SomeArgs args = obtainArgs(); 137 args.arg1 = arg2; 138 args.arg2 = arg3; 139 return mH.obtainMessage(what, arg1, 0, args); 140 } 141 142 public Message obtainMessageOO(int what, Object arg1, Object arg2) { 143 SomeArgs args = obtainArgs(); 144 args.arg1 = arg1; 145 args.arg2 = arg2; 146 return mH.obtainMessage(what, 0, 0, args); 147 } 148 149 public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) { 150 SomeArgs args = obtainArgs(); 151 args.arg1 = arg1; 152 args.arg2 = arg2; 153 args.arg3 = arg3; 154 return mH.obtainMessage(what, 0, 0, args); 155 } 156 157 public Message obtainMessageOOOO(int what, Object arg1, Object arg2, 158 Object arg3, Object arg4) { 159 SomeArgs args = obtainArgs(); 160 args.arg1 = arg1; 161 args.arg2 = arg2; 162 args.arg3 = arg3; 163 args.arg4 = arg4; 164 return mH.obtainMessage(what, 0, 0, args); 165 } 166 167 public Message obtainMessageIIII(int what, int arg1, int arg2, 168 int arg3, int arg4) { 169 SomeArgs args = obtainArgs(); 170 args.argi1 = arg1; 171 args.argi2 = arg2; 172 args.argi3 = arg3; 173 args.argi4 = arg4; 174 return mH.obtainMessage(what, 0, 0, args); 175 } 176 177 public Message obtainMessageIIIIII(int what, int arg1, int arg2, 178 int arg3, int arg4, int arg5, int arg6) { 179 SomeArgs args = obtainArgs(); 180 args.argi1 = arg1; 181 args.argi2 = arg2; 182 args.argi3 = arg3; 183 args.argi4 = arg4; 184 args.argi5 = arg5; 185 args.argi6 = arg6; 186 return mH.obtainMessage(what, 0, 0, args); 187 } 188 189 public Message obtainMessageIIIIO(int what, int arg1, int arg2, 190 int arg3, int arg4, Object arg5) { 191 SomeArgs args = obtainArgs(); 192 args.arg1 = arg5; 193 args.argi1 = arg1; 194 args.argi2 = arg2; 195 args.argi3 = arg3; 196 args.argi4 = arg4; 197 return mH.obtainMessage(what, 0, 0, args); 198 } 199} 200