2013-05-12 80 views
3

我似乎有同樣的問題,因爲這紳士: SensorEventListener doesn't get unregistered with unregisterListener() method的Android,螺紋,無法註銷SensorEventListener

public void onCreate(Bundle bundle) { 
      super.onCreate(bundle); 
      ... 
      loopThread(); 
} 

private void loopThread() { 
      boolean found = kill; 
      System.out.println("Looping until Found!"); 
      locationThread = new Thread(){ 
        private float myacc; 

        @Override 
        @Override 
        public void run() { 

          while (found == false && !kill){ 
            System.out.println("Another Loop!"); 
            getMyLoc(); 
            found = isFound(mylat,mylng,target_lat,target_lng,radius); 
            try { 
              synchronized(locationThread){ 
                locationThread.wait(100); 
              } 

            } catch (InterruptedException e) { 
              // TODO Auto-generated catch block 
              e.printStackTrace(); 
            } 
          } 
          mSensorManager.unregisterListener(senslistener, mAccelerometer); 
          mSensorManager.unregisterListener(senslistener, mGravitometer); 
          mSensorManager.unregisterListener(senslistener); 
          locationThread.interrupt(); 
        } 
} 

@Override 
    public void onPause(){ 
      super.onPause(); 
      mSensorManager.unregisterListener(senslistener, mAccelerometer); 
      mSensorManager.unregisterListener(senslistener, mGravitometer); 
      locationThread.interrupt(); 
    } 
    @Override 
    public void onResume(){ 
      super.onResume(); 
      senslistener = new mySensorEventListener(); 
      mSensorManager.registerListener(senslistener, mAccelerometer,  SensorManager.SENSOR_DELAY_NORMAL); 
      mSensorManager.registerListener(senslistener, mGravitometer, SensorManager.SENSOR_DELAY_NORMAL); 
      if (true) 
        loopThread(); 
    } 

private void registerSensors() { 
      mSensorManager =  (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); 
      List<Sensor> mySensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION); 
      if(mySensors.size() > 0){ 
        mAccelerometer =  mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
        mGravitometer =  mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 

        mSensorManager.registerListener(senslistener, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
        mSensorManager.registerListener(senslistener, mGravitometer, SensorManager.SENSOR_DELAY_NORMAL); 
        Toast.makeText(context, "Getting your location...", Toast.LENGTH_LONG).show(); 
      } 
      else{ 
        Toast.makeText(context, "No ORIENTATION Sensor", Toast.LENGTH_LONG).show(); 
      } 
    } 


public boolean onKeyDown(int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_BACK) { 
        Intent i = new Intent(this, MFLMain.class); 
        if (locationThread != null) 
          if(locationThread.isAlive()){ 

        mSensorManager.unregisterListener(senslistener, mAccelerometer); 
        mSensorManager.unregisterListener(senslistener, mGravitometer); 
        mSensorManager.unregisterListener(senslistener); 
        locationThread.interrupt(); 
          } 
        locator.stopListener(); 
        kill = true; 
        System.out.println("Kill the app "+kill); 
        finish(); 
        startActivity(i); 
        return false; 
      } 
      return super.onKeyDown(keyCode, event); 
    } 

當我打回隱藏應用程序和殺滅活動,我仍然得到系統。在logcat中。這就是因爲缺乏system.out而證明的。我非常困惑,我不認爲範圍是問題,因爲傳感器管理者正在通過初始化方法實例化,而沒有其他地方。

回答

1

也許是一個長鏡頭,但唯一可以看到與已經工作的例子和你的不同的例子(沒有看到額外的代碼)將實現SensorEventListener並將其傳遞到註冊表中並取消註冊事件,而不是您的自定義SensorEventListener。

通過使用new運算符來實例化偵聽器以及似乎適用於他的答案,可以查看此人嘗試使用此方法的此stackoverflow。

How to convert a program that uses SensorListener to SensorEventListener

public class MySensorActivity extends Activity implements SensorEventListener { 


public void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     ... 
     loopThread(); 
} 

    private void loopThread() { 
     boolean found = kill; 
     System.out.println("Looping until Found!"); 
     locationThread = new Thread(){ 
       private float myacc; 

       @Override 
       @Override 
       public void run() { 

         while (found == false && !kill){ 
           System.out.println("Another Loop!"); 
           getMyLoc(); 
           found = isFound(mylat,mylng,target_lat,target_lng,radius); 
           try { 
             synchronized(locationThread){ 
               locationThread.wait(100); 
             } 

           } catch (InterruptedException e) { 
             // TODO Auto-generated catch block 
             e.printStackTrace(); 
           } 
         } 
         mSensorManager.unregisterListener(this, mAccelerometer); 
         mSensorManager.unregisterListener(this, mGravitometer); 
         mSensorManager.unregisterListener(this); 
         locationThread.interrupt(); 
       } 
} 

@Override 
public void onPause(){ 
     super.onPause(); 
     mSensorManager.unregisterListener(this, mAccelerometer); 
     mSensorManager.unregisterListener(this, mGravitometer); 
     locationThread.interrupt(); 
} 
@Override 
public void onResume(){ 
     super.onResume(); 
     registerSensors(); 
     mSensorManager.registerListener(this, mAccelerometer,  SensorManager.SENSOR_DELAY_NORMAL); 
     mSensorManager.registerListener(this, mGravitometer, SensorManager.SENSOR_DELAY_NORMAL); 
     if (true) 
       loopThread(); 
} 

private void registerSensors() { 
     mSensorManager =  (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); 
     List<Sensor> mySensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION); 
     if(mySensors.size() > 0){ 
       mAccelerometer =  mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
       mGravitometer =  mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 

       mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
       mSensorManager.registerListener(this, mGravitometer, SensorManager.SENSOR_DELAY_NORMAL); 
       Toast.makeText(context, "Getting your location...", Toast.LENGTH_LONG).show(); 
     } 
     else{ 
       Toast.makeText(context, "No ORIENTATION Sensor", Toast.LENGTH_LONG).show(); 
     } 
} 


public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 
       Intent i = new Intent(this, MFLMain.class); 
       if (locationThread != null) 
         if(locationThread.isAlive()){ 

       mSensorManager.unregisterListener(this, mAccelerometer); 
       mSensorManager.unregisterListener(this, mGravitometer); 
       mSensorManager.unregisterListener(this); 
       locationThread.interrupt(); 
         } 
       locator.stopListener(); 
       kill = true; 
       System.out.println("Kill the app "+kill); 
       finish(); 
       startActivity(i); 
       return false; 
     } 
     return super.onKeyDown(keyCode, event); 
}