bma*_*cov 6 multithreading android phone-state-listener android-looper
我在尝试在后台线程中对 * 回调方法运行 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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后,从内部Service开始,我开始一个新的HandlerThread并将我的附加PhoneStateHandler到它的'looper:
HandlerThread mThread = new HandlerThread("PhoneStateListenerThread");
mThread.start();
PhoneStateHandler mHandler = new PhoneStateHandler(this, mThread.getLooper());
mHandler.sendMessage(Message.obtain(mHandler, PhoneStateHandler.MESSAGE_START));
Run Code Online (Sandbox Code Playgroud)
我期望的是,诸如MyPhoneStateListener.onCallStateChanged()在mThread线程而不是 UI 线程上执行的方法。我正在利用这样一个事实,即首次创建 PhoneStateListener 时,它会绑定到其当前线程的 Looper。这是没有记录的,但这就是实际发生的事情。
然而,我观察到的是,尽管PhoneStateHandler.onHandleMessage()在HandlerThread's looper 中调用了该方法(如我所料),但MyPhoneStateListener.onCallStateChanged()仍然在 UI 线程中被调用。
关于我的代码有什么问题的任何线索?
谢谢
| 归档时间: |
|
| 查看次数: |
1207 次 |
| 最近记录: |