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