(un)从主线程中的连接线程注册监听器

时间:2018-07-03 14:12:28

标签: java android multithreading android-asynctask

我正在开发一个通过蓝牙发送加速度计生成的数据的应用程序。传感器在ConnectedThread中实现,并在用户成功连接到远程设备后进行注册。问题是我需要实现AsyncTaskonClick()按钮方法,以等待直到从远程设备接收到返回信号。应该使用onPreExecute()方法取消注册Sensor,然后使用主线程中的onPostExecute()方法重新注册Sensor。

这是AsyncTask类的示例,该类在主线程中实现并在onClick()方法上运行。 Thread.sleep()模拟等待返回信号。

private class AsyncWait extends AsyncTask <Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {

        synchronized (this){
            while(true){
                try {
                    mc_flag = true;

                    Thread.sleep(3000); 

                    if(mc_flag){
                       break;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    @Override
    protected void onPreExecute() {
        // TODO: unregister listener
        dialog2 = ProgressDialog.show(Accelerometer_Activity.this, "Parking", "In progress..", true, false);
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO: register listener
        dialog2.dismiss();
        mc_flag = false;
    }
}

这是ConnectedThread已实现SensorEventListener

私有类Thread_slanje扩展了Thread实现的SensorEventListener {

        @Override
        public void run() {
            sManager = (SensorManager) kontekst.getSystemService(Context.SENSOR_SERVICE);
            senzor = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

            handler_thr = new HandlerThread("AccelerometerLogListener",Thread.NORM_PRIORITY);
            handler_thr.start();

            handler = new Handler (handler_thr.getLooper());

            sManager.registerListener(this, senzor, SensorManager.SENSOR_DELAY_NORMAL, handler);
        }

这是killThread()方法,用于在ConnectedThread中注销侦听器。

private void killThread(){

        sManager.unregisterListener(this,senzor);
        sManager = null;

    if(handler_thr.isAlive()) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            handler_thr.quitSafely();
        } else {
            handler_thr.quit();
        }
    }
}

我的问题是,我该如何注册和注销在主线程的ConnectedThread中实现的SensorEventListener,或者有更好的方法来实现这一点?

0 个答案:

没有答案