Доступ к разделяемым настройкам в onLocationChanged принудительно закрывает приложение - PullRequest
0 голосов
/ 29 декабря 2010

В моем приложении есть служба, которая получает местоположение устройства и передает эту информацию в поток. Мне также нужно передать значение sharedpreferences в поток. Когда я делаю это, приложение получает ошибку во время выполнения и принудительно закрывается. Все остальное работает и передается потоку, если я не пытаюсь получить это значение.

Полагаю, это происходит из-за того, что onLocationChanged() не имеет контекста, может кто-нибудь помочь с этим, пожалуйста?

Сервисный код:

 public class TrackGPS extends Service implements LocationListener{  
     LocationManager lm;   
     LocationListener loc;  
     public SharedPreferences sharedpreferences;      
     public static final String US = "usersettings";  
     public String prefPhoneNum = "prefPhoneNum";  
     double lat = 0, lon = 0, alt = 0, acc = 0;  
     long tim = 0;  

    public void onCreate() {
           super.onCreate();  

          /* Calling the value works fine here but can't pass to onLocationChanged() */ 
          // sharedpreferences = getSharedPreferences(US, MODE_WORLD_READABLE);
          // prefPhoneNum = sharedpreferences.getString("prefPhoneNum" , "");

           lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
           loc = new TrackGPS();
           enableGPS();   
           onDestroy();
           stopSelf();
}

public void enableGPS() {  
    new CountDownTimer(120000, 1000) {                  //120 seconds
         public void onTick(long millisUntilFinished) 
         {
              lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, loc);             
         }
         public void onFinish() 
         {                  
                lm.removeUpdates(loc);      
         }
    }.start();         
}

@Override
public void onLocationChanged(Location location) {
    lat = location.getLatitude();
    lon = location.getLongitude();
    alt = location.getAltitude();
    acc = location.getAccuracy();
    tim = location.getTime();

    sharedpreferences = getSharedPreferences(US, MODE_WORLD_READABLE);
    prefPhoneNum = sharedpreferences.getString("prefPhoneNum" , "");

    Thread cThread = new Thread(new SocketsClient(lat, lon, alt, acc, tim, prefPhoneNum));
    cThread.start();
}
@Override
public void onProviderDisabled(String provider) {   }
@Override
public void onProviderEnabled(String provider)  {   }
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {   }
@Override
public IBinder onBind(Intent intent) { return null; }
public void onDestroy() { super.onDestroy(); }
}

Ошибки Logcat:

D/LocationManager(3912): requestLocationUpdates: provider = gps, listener = accel.working.TrackGPS@4628bce0  
D/GpsLocationProvider(96): setMinTime 0  
D/GpsLocationProvider(96): startNavigating  
D/GpsLocationProvider(96): TTFF: 3227  
D/AndroidRuntime(912): Shutting down VM  
W/dalvikvm(3912): threadid=1: thread exiting with uncaught exception (group=0x400259f8)  
E/AndroidRuntime(3912): FATAL EXCEPTION: main  
E/AndroidRuntime(3912): java.lang.NullPointerException  
E/AndroidRuntime(3912): at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)  
E/AndroidRuntime(3912): at accel.working.TrackGPS.onLocationChanged(TrackGPS.java:63)  
E/AndroidRuntime(3912): at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:191)
E/AndroidRuntime(3912): at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:124)  
E/AndroidRuntime(3912): at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:140)  
E/AndroidRuntime(3912): at android.os.Handler.dispatchMessage(Handler.java:99)  
E/AndroidRuntime(3912): at android.os.Looper.loop(Looper.java:144)  
E/AndroidRuntime(3912): at android.app.ActivityThread.main(ActivityThread.java:4937)  
E/AndroidRuntime(3912): at java.lang.reflect.Method.invokeNative(Native Method)  
E/AndroidRuntime(3912): at java.lang.reflect.Method.invoke(Method.java:521)  
E/AndroidRuntime(3912): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)  
E/AndroidRuntime(3912): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)  
E/AndroidRuntime(3912): at dalvik.system.NativeStart.main(Native Method) 

Ответы [ 2 ]

1 голос
/ 29 декабря 2010

Ну вот твоя первая проблема

loc = new TrackGPS();

Никогда, НИКОГДА не создавайте экземпляр действия, или сервиса, или любого другого класса, подобного этому, с new. С этим даже не стоит углубляться в ваш код.

Но даже в этом случае,

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, loc);

Должен быть вызван только один раз. Он вызывает ваш onLocationChanged КАЖДЫЙ РАЗ, чтобы получить обновление. Вам не нужно продолжать называть это.

РЕДАКТИРОВАТЬ : О, я знаю, что вы там делаете, и в этом нет необходимости. Вы можете запроситьLocationUpdates в onCreate.

Также

onDestroy();

Вы никогда не должны вызывать этот метод самостоятельно. Это называется рамкой. Не делай этого

И, наконец, вы звоните

stopSelf();

перед тем, как ваш поток, который запрашивает расположение обновлений, будет вызван Конечно, это приведет к неопределенному поведению. Вы останавливаете службу, не отменяя регистрацию слушателя.

0 голосов
/ 16 мая 2011

Согласно твоему утверждению "никогда не делай этого", это неправильно?

окончательный обработчик mHandler_AboutGeneric = новый обработчик ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...