2010-12-29 6 views
0

私のアプリケーションでは、デバイスの場所を取得してこの情報をスレッドに渡すサービスがあります。私はまたスレッドにsharedpreferences値を渡す必要があります。私がこれを行うと、アプリケーションはランタイムエラーを取得し、強制的に閉じます。私がその価値を得ようとしなければ、他のすべてがうまく機能し、スレッドに渡されます。onLocationChanged内の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 = [email protected] 
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) 

答えて

1

はさてここで、これまで、EVER、インスタンスを作成しないでください、あなたの最初の問題

loc = new TrackGPS(); 

ですアクチのvityまたはサービスまたはnewのような他のクラス。そこではコードをもっと活用する価値はありません。

しかし、そうであっても、この

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

は一度だけ呼ばれるべき。それはあなたのonLocationChangedを更新を取得するたびに呼び出します。あなたはそれを続けておく必要はありません。

EDIT:オハイオ州あなたはあなたがそこでやっていることを知っているので、必要ありません。 onCreateでLocationUpdatesをリクエストできます。

また、

onDestroy(); 

あなたは、このメソッドを自分で呼び出すことはありません。これはフレームワークによって呼び出されます。それを

をしないでくださいそして最後に、あなたがこれまでと呼ばれrequestslocationupdatesあなたのスレッドの前に

stopSelf(); 

を呼んでいます。もちろん、未定義の動作になります。リスナーの登録を解除することなく、サービスを停止します。

+0

私はすべてのアドバイスを受け取り、自分のコードを変更しました。そして今、それは正しいsharedpreference値を読んでも魅力的に機能します。もう一度Falmarriに感謝します! – bobby123

0

これまでにないことによると、これは間違っていますか?

最終ハンドラmHandler_AboutGeneric = newハンドラ();