6

バックラウンド スレッドで * コールバック メソッドに対して PhoneStateListener を実行しようとすると問題が発生します。これが私がこれまでにしたことです:

まず、PhoneStateListener の実装を作成しました。次の行に何か:

public MyPhoneStateListener extends PhoneStateListener {
    private TelephonyManager mTelephonyManager;

    public MyPhoneStateListener(Context context) {
        mTelephonyManager = (TelephonyManager) context.getSystemServices(Context.TELEPHONY_SERVICE);
    }

    @Override
    public void onCallStateChanged(int state, String incomingNumber) { ... }

    public void startListening() {
        mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE);
    }
}

次に、Handler クラスを作成しました。

public PhoneStateHandler extends Handler {
    private Context mContext;
    private MyPhoneStateListener mListener;

    public static final int MESSAGE_START = 0;

    public PhoneStateHandler(Context context, Looper looper) {
        super(looper);
        mContext = context;
    }

    @Override
    public void onHandleMessage(Message message) {
        if (mListener == null) {
            mListener = new MyPhoneStateListener(mContext);
        }

        switch (message.what) {
        case MESSAGE_START:
            mListener.startListening();
            break;
        }
    }
}

最後に、a の中からService新しいものを開始し、そのルーパーにHandlerThreadmy をアタッチします。PhoneStateHandler

HandlerThread mThread = new HandlerThread("PhoneStateListenerThread");
mThread.start();
PhoneStateHandler mHandler = new PhoneStateHandler(this, mThread.getLooper());
mHandler.sendMessage(Message.obtain(mHandler, PhoneStateHandler.MESSAGE_START));

私が期待しているのは、UI スレッドではなくスレッドMyPhoneStateListener.onCallStateChanged()で実行されるメソッドなどです。mThreadPhoneStateListener が最初に作成されたときに、現在のスレッドの Looper にバインドされるという事実を利用しています。これは文書化されていませんが、実際に起こっていることです。

ただし、私が観察したのは、PhoneStateHandler.onHandleMessage()メソッドがHandlerThreadのルーパーで呼び出されるにもかかわらず (予想どおり)、MyPhoneStateListener.onCallStateChanged()が UI スレッドで呼び出されることです。

私のコードの何が問題なのか手がかりはありますか?

ありがとう

4

0 に答える 0