2013-10-10 3 views
0

В Android я создаю Сервис, который будет прослушивать изменение значения датчика. Но мое приложение продолжает сбой, когда я его открываю. Если я удалить строкиMy Application Crashes при регистрации регистратора сенсора

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     mAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     sensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 

Он отлично работает

Я создал класс обслуживания следующим образом:

public class CustomSensorService extends Service implements SensorEventListener{ 

    static SensorManager sensorManager; 
    static Sensor mAccelerometer; 
    static Context mContext; 
    static final String LOG_TAG = "SimpleService"; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Toast.makeText(this,"Service Created",Toast.LENGTH_SHORT).show(); 
     sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     mAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     sensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 

    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     Log.d(LOG_TAG, "onSensorChanged"); 
     Toast.makeText(mContext,"Heelooo" , Toast.LENGTH_SHORT).show(); 

     stopSelf(); 


    } 

}

И моей деятельности как:

public class MainActivity extends Activity { 

    Intent intent; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     intent = new Intent(this, CustomSensorService.class); 
    } 
    @Override 
    public void onResume(){ 
     super.onResume(); 
     startService(intent); 

    } 
} 

Th это является Manifest

<application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.learnandroidservice.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name=".CustomSensorService"/> 
    </application> 

Трассировка: enter image description here

+0

Пожалуйста, добавьте Stacktrace на ваш вопрос – fab

+0

было бы полезно добавить журнал для этого сбоя. – Misca

+0

. Вам нужно предоставить точное сообщение об ошибке или лучше, трассировка стека – MatF

ответ

1

mContext является нулевым - вы должны инициализировать его, прежде чем передать его Toast.makeText().

Service является контекст, так что вы можете просто позвонить

Toast.makeText(this,"Heelooo" , Toast.LENGTH_SHORT).show(); 

Это работает, когда вы удалите строки, вы упоминаете, потому что тогда SensorListener никогда не зарегистрирован, и onSensorChanged никогда не вызывается.

+0

Спасибо за вашу помощь по этому поводу. –

1

В классе CustomSensorService: метод Inside onSensorChanged(): вы использовали значение переменной mContext без его инициализации.

Ваш код: Toast.makeText (mContext, «Heelooo», Toast.LENGTH_SHORT) .show();

Изменения, которые необходимо сделать, чтобы решить эту проблему:

Toast.makeText (это, "Heelooo", Toast.LENGTH_SHORT) .show();

Из-за вышеуказанной причины вы получаете исключение NullPointerException при отображении тоста.

Смежные вопросы