HandlerCaller.java revision b798689749c64baba81f02e10cf2157c747d6b46
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 obtainMessageIO(int what, int arg1, Object arg2) { 119 return mH.obtainMessage(what, arg1, 0, arg2); 120 } 121 122 public Message obtainMessageIO(int what, int arg1, int arg2, Object arg3) { 123 return mH.obtainMessage(what, arg1, arg2, arg3); 124 } 125 126 public Message obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) { 127 SomeArgs args = obtainArgs(); 128 args.arg1 = arg2; 129 args.arg2 = arg3; 130 return mH.obtainMessage(what, arg1, 0, args); 131 } 132 133 public Message obtainMessageOO(int what, Object arg1, Object arg2) { 134 SomeArgs args = obtainArgs(); 135 args.arg1 = arg1; 136 args.arg2 = arg2; 137 return mH.obtainMessage(what, 0, 0, args); 138 } 139 140 public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) { 141 SomeArgs args = obtainArgs(); 142 args.arg1 = arg1; 143 args.arg2 = arg2; 144 args.arg3 = arg3; 145 return mH.obtainMessage(what, 0, 0, args); 146 } 147 148 public Message obtainMessageIIII(int what, int arg1, int arg2, 149 int arg3, int arg4) { 150 SomeArgs args = obtainArgs(); 151 args.argi1 = arg1; 152 args.argi2 = arg2; 153 args.argi3 = arg3; 154 args.argi4 = arg4; 155 return mH.obtainMessage(what, 0, 0, args); 156 } 157 158 public Message obtainMessageIIIIII(int what, int arg1, int arg2, 159 int arg3, int arg4, int arg5, int arg6) { 160 SomeArgs args = obtainArgs(); 161 args.argi1 = arg1; 162 args.argi2 = arg2; 163 args.argi3 = arg3; 164 args.argi4 = arg4; 165 args.argi5 = arg5; 166 args.argi6 = arg6; 167 return mH.obtainMessage(what, 0, 0, args); 168 } 169 170 public Message obtainMessageIIIIO(int what, int arg1, int arg2, 171 int arg3, int arg4, Object arg5) { 172 SomeArgs args = obtainArgs(); 173 args.arg1 = arg5; 174 args.argi1 = arg1; 175 args.argi2 = arg2; 176 args.argi3 = arg3; 177 args.argi4 = arg4; 178 return mH.obtainMessage(what, 0, 0, args); 179 } 180} 181