2014-07-26 3 views
-1

Help! 나는 무한 루프에 빠졌고 나는 일어날 수 없다!onSensorChanged의 무한 루프

**** MisbehavingActivity에서 onCreate

결과.

**** MisbehavingActivity onResume Register.

**** MisbehavingActivity onAccuracyChanged.

**** 잘못된 측정 가속도계 onSensorChanged.

**** MisbehavingActivity onPause Unregister.

**** 잘못된 측정 가속도계 onSensorChanged.

**** MisbehavingActivity onPause Unregister.

**** 잘못된 측정 가속도계 onSensorChanged.

**** MisbehavingActivity onPause Unregister.

**** 잘못된 측정 가속도계 onSensorChanged.

**** MisbehavingActivity onPause Unregister.

**** 잘못된 측정 가속도계 onSensorChanged.

**** MisbehavingActivity onPause Unregister.

등 등까지 :

package com.apackage.amiok; 

import android.content.Context; 
//import android.content.Intent; 
import android.hardware.Sensor; 
import static android.hardware.Sensor.TYPE_ACCELEROMETER; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class MisbehavingActivity extends AbstrActivity implements OnClickListener, SensorEventListener { 

    private static final String TOAST = "**** MisbehavingActivity "; 
    SensorManager sensorManager; 
    Sensor accelerometer; 
    Button aButton; 
    //SensorEventListener sensorListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     logStuff(TOAST + "onCreate. "); 

     sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     accelerometer = sensorManager.getDefaultSensor(TYPE_ACCELEROMETER); 

     setContentView(R.layout.activity_main); 

     aButton = ((Button) findViewById(R.id.buttonToStop)); 
     aButton.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 
     logStuff(TOAST + "onClick."); 
     onPause(); 
     finish(); 
    } 

    @Override 
    public void onResume() { 
     logStuff(TOAST + "onResume Register."); 
     super.onResume(); 
     // register the listener 
     accelerometer = sensorManager.getDefaultSensor(TYPE_ACCELEROMETER); 
     sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); 
    } 

    @Override 
    public void onPause() { 
     logStuff(TOAST + "onPause Unregister."); 

     // unregister the listener for all sensors 
     sensorManager.unregisterListener(this); 
     super.onPause(); 
    } 


    // SensorEventListener stuff 

     @Override 
     public void onSensorChanged(SensorEvent event) { 
      logStuff(TOAST + "Accelerometer onSensorChanged."); 
      onPause(); 
      finish(); 

     } 

     @Override 
     public void onAccuracyChanged(Sensor sensor, int accuracy) { 
      logStuff(TOAST + "onAccuracyChanged."); 
      // Not sure I need to do anything here... 
     } 
} 

답변

0

당신은에서 onCreate에 두 번 SensorEventListener로 활동 인스턴스를 등록 :

"불행하게도, Amiok이을 중단했다"

여기에 코드입니다 onResume 메서드는 onResume 메서드에 하나만 등록하고 onCreate 메서드는 등록을 삭제합니다. 좋은 연습은 onPause와 onResume의 첫 번째 슈퍼 메서드를 호출합니다. SensorManager에서 예제 코드를 찾아보십시오.

+0

감사합니다. Joseph! 실제로 처음부터 그런 식으로 했었지만 똑같은 결과가 나왔기 때문에 바꿨습니다. 진짜 질문은 왜 내 "unregisterListener"문이 작동하지 않는 것입니까? – Thisland

+0

내 업데이트를보세요. – Joseph

+0

흠. 나는 Joseph이 제안한 "우수 사례"변경 사항을 작성했으며, 내 AbstrActivity에있는 logStuff에 대한 모든 호출을 makeNotification으로 대체했으며 다소 도움이되었지만 onSensorChanged 메소드가 적어도 두 번 호출되는 것처럼 보입니다. 등록을 취소하기 전에! 적어도 지금은 충돌하지 않습니다. 감사! – Thisland