| package com.android.internal.os; |
| |
| import android.content.Context; |
| import android.os.Handler; |
| import android.os.Looper; |
| import android.os.Message; |
| |
| public class HandlerCaller { |
| private static final String TAG = "HandlerCaller"; |
| private static final boolean DEBUG = false; |
| |
| public final Context mContext; |
| |
| final Looper mMainLooper; |
| final Handler mH; |
| |
| final Callback mCallback; |
| |
| public static class SomeArgs { |
| SomeArgs next; |
| |
| public Object arg1; |
| public Object arg2; |
| public Object arg3; |
| public Object arg4; |
| public int argi1; |
| public int argi2; |
| public int argi3; |
| public int argi4; |
| public int argi5; |
| public int argi6; |
| } |
| |
| static final int ARGS_POOL_MAX_SIZE = 10; |
| int mArgsPoolSize; |
| SomeArgs mArgsPool; |
| |
| class MyHandler extends Handler { |
| MyHandler(Looper looper) { |
| super(looper); |
| } |
| |
| @Override |
| public void handleMessage(Message msg) { |
| mCallback.executeMessage(msg); |
| } |
| } |
| |
| public interface Callback { |
| public void executeMessage(Message msg); |
| } |
| |
| public HandlerCaller(Context context, Callback callback) { |
| mContext = context; |
| mMainLooper = context.getMainLooper(); |
| mH = new MyHandler(mMainLooper); |
| mCallback = callback; |
| } |
| |
| public SomeArgs obtainArgs() { |
| synchronized (mH) { |
| SomeArgs args = mArgsPool; |
| if (args != null) { |
| mArgsPool = args.next; |
| args.next = null; |
| mArgsPoolSize--; |
| return args; |
| } |
| } |
| return new SomeArgs(); |
| } |
| |
| public void recycleArgs(SomeArgs args) { |
| synchronized (mH) { |
| if (mArgsPoolSize < ARGS_POOL_MAX_SIZE) { |
| args.next = mArgsPool; |
| mArgsPool = args; |
| mArgsPoolSize++; |
| } |
| } |
| } |
| |
| public void executeOrSendMessage(Message msg) { |
| // If we are calling this from the main thread, then we can call |
| // right through. Otherwise, we need to send the message to the |
| // main thread. |
| if (Looper.myLooper() == mMainLooper) { |
| mCallback.executeMessage(msg); |
| msg.recycle(); |
| return; |
| } |
| |
| mH.sendMessage(msg); |
| } |
| |
| public void sendMessage(Message msg) { |
| mH.sendMessage(msg); |
| } |
| |
| public Message obtainMessage(int what) { |
| return mH.obtainMessage(what); |
| } |
| |
| public Message obtainMessageBO(int what, boolean arg1, Object arg2) { |
| return mH.obtainMessage(what, arg1 ? 1 : 0, 0, arg2); |
| } |
| |
| public Message obtainMessageBOO(int what, boolean arg1, Object arg2, Object arg3) { |
| SomeArgs args = obtainArgs(); |
| args.arg1 = arg2; |
| args.arg2 = arg3; |
| return mH.obtainMessage(what, arg1 ? 1 : 0, 0, args); |
| } |
| |
| public Message obtainMessageO(int what, Object arg1) { |
| return mH.obtainMessage(what, 0, 0, arg1); |
| } |
| |
| public Message obtainMessageI(int what, int arg1) { |
| return mH.obtainMessage(what, arg1, 0); |
| } |
| |
| public Message obtainMessageIO(int what, int arg1, Object arg2) { |
| return mH.obtainMessage(what, arg1, 0, arg2); |
| } |
| |
| public Message obtainMessageIIO(int what, int arg1, int arg2, Object arg3) { |
| return mH.obtainMessage(what, arg1, arg2, arg3); |
| } |
| |
| public Message obtainMessageIOO(int what, int arg1, Object arg2, Object arg3) { |
| SomeArgs args = obtainArgs(); |
| args.arg1 = arg2; |
| args.arg2 = arg3; |
| return mH.obtainMessage(what, arg1, 0, args); |
| } |
| |
| public Message obtainMessageOO(int what, Object arg1, Object arg2) { |
| SomeArgs args = obtainArgs(); |
| args.arg1 = arg1; |
| args.arg2 = arg2; |
| return mH.obtainMessage(what, 0, 0, args); |
| } |
| |
| public Message obtainMessageOOO(int what, Object arg1, Object arg2, Object arg3) { |
| SomeArgs args = obtainArgs(); |
| args.arg1 = arg1; |
| args.arg2 = arg2; |
| args.arg3 = arg3; |
| return mH.obtainMessage(what, 0, 0, args); |
| } |
| |
| public Message obtainMessageOOOO(int what, Object arg1, Object arg2, |
| Object arg3, Object arg4) { |
| SomeArgs args = obtainArgs(); |
| args.arg1 = arg1; |
| args.arg2 = arg2; |
| args.arg3 = arg3; |
| args.arg4 = arg4; |
| return mH.obtainMessage(what, 0, 0, args); |
| } |
| |
| public Message obtainMessageIIII(int what, int arg1, int arg2, |
| int arg3, int arg4) { |
| SomeArgs args = obtainArgs(); |
| args.argi1 = arg1; |
| args.argi2 = arg2; |
| args.argi3 = arg3; |
| args.argi4 = arg4; |
| return mH.obtainMessage(what, 0, 0, args); |
| } |
| |
| public Message obtainMessageIIIIII(int what, int arg1, int arg2, |
| int arg3, int arg4, int arg5, int arg6) { |
| SomeArgs args = obtainArgs(); |
| args.argi1 = arg1; |
| args.argi2 = arg2; |
| args.argi3 = arg3; |
| args.argi4 = arg4; |
| args.argi5 = arg5; |
| args.argi6 = arg6; |
| return mH.obtainMessage(what, 0, 0, args); |
| } |
| |
| public Message obtainMessageIIIIO(int what, int arg1, int arg2, |
| int arg3, int arg4, Object arg5) { |
| SomeArgs args = obtainArgs(); |
| args.arg1 = arg5; |
| args.argi1 = arg1; |
| args.argi2 = arg2; |
| args.argi3 = arg3; |
| args.argi4 = arg4; |
| return mH.obtainMessage(what, 0, 0, args); |
| } |
| } |