如何释放 Looper 相关的资源?

public float getProximity(){
    CountDownLatch countDownLatch = new CountDownLatch(1);
    MyThread thread = new MyThread();
    thread.countDownLatch = countDownLatch;
    thread.start();
    try {
        countDownLatch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return thread.proximity;
}

public class MyThread extends Thread{
    public float proximity;
    public CountDownLatch countDownLatch;
    public void run(){
        SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
        MySensorEventListener listener = new MySensorEventListener();
        Looper.prepare();
        listener.looper = Looper.myLooper();
        listener.sensorManager = sensorManager;
        Handler handler = new Handler();
        sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME, handler);
        Looper.loop();
        proximity = listener.proximity;
        countDownLatch.countDown();
    }
};

public class MySensorEventListener implements SensorEventListener {
    public Looper looper;
    public SensorManager sensorManager;
    public float proximity;
    public void onAccuracyChanged(Sensor sensor, int accuracy) {}
    public void onSensorChanged(SensorEvent event) {
        proximity = event.values[0];
        sensorManager.unregisterListener(this);
        looper.quit();
    }
}

上面的代码能正确释放所有的资源吗?

阅读 2.9k
1 个回答

可以, 但为啥还要用一个Handler呢? 感觉Handler在这个地方没任何用处

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题