0

こんにちは私はgpsに基づいてアプリケーションを実行しています。プロジェクトのサービスとしてgpsを使用しています。gpsをオンにすると、場所が正しく表示され、アプリケーションは正常に実行されますが、その後、アプリを完全に終了し、gpsをオフにするとクラッシュメッセージが表示されます。つまり、アプリを終了または終了しても、サービスクラスはまだ実行されています。また、アプリの実行中にgpsをオフにするとアプリがクラッシュしますが、gpsをオフにしないと正常に動作します。どうすればこの問題を解決できますか。GPSに使用されるサービスクラスを表示します

public class Gps_Service extends Service {

TextView txtv;
List<Address> myList;
String addressStr;
LocationManager lm;
LocationListener ll;
SQLiteDatabase DiaryDB = null;

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}
@Override
public void onCreate() {
    super.onCreate();
    System.out.println("@@@@@@@@@@@ serviceOnCreate");
//      Toast.makeText(this, "GPS Service started(Diary)", Toast.LENGTH_LONG).show();       

    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    ll = new mylocationlistener();
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);

}

@Override
public void onDestroy() {
    super.onDestroy();

//      Toast.makeText(this, "GPS Service Destroyed(Diary)", Toast.LENGTH_LONG).show();

    lm.removeUpdates(ll);
    System.out.println("@@@@@@@@@@@ inside ONDESTROY GPS listener removed");
}

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
    {
        Log.v("StartServiceAtBoot", "StartAtBootService -- onStartCommand()");          
//          Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        return START_STICKY;
    }

 private class mylocationlistener implements LocationListener
    {

        public void onLocationChanged(Location location) 
        {
            if (location != null) {
                Geocoder myLocation = new Geocoder(Gps_Service.this, Locale.getDefault());
//                  Toast.makeText(MyService.this,location.getLatitude() + "       " + location.getLongitude()   +"\n",Toast.LENGTH_LONG).show();
//                  DiaryDB = MyService.this.openOrCreateDatabase("DIARY_DATABASE", MODE_PRIVATE, null);
//                  DiaryDB.execSQL("INSERT INTO Locations(LATITUDE, LONGITUDE) VALUES('"   +location.getLatitude()+"','"+location.getLongitude()+"')");
//                  DiaryDB.close();
            //  ParseTweetsActivity.latitude  = ""+location.getLatitude();
                //ParseTweetsActivity.longitude = ""+location.getLongitude();
                AndroidGoogleMapsActivity.lats   = Double.parseDouble(""+location.getLatitude());
                AndroidGoogleMapsActivity.longt = Double.parseDouble(""+location.getLongitude());
            Advertiser_get_direction.latitudefrom = Double.parseDouble(""+location.getLongitude());
                Advertiser_get_direction.longtitudefrom = Double.parseDouble(""+location.getLongitude());

                AndroidGoogleMapsActivity.longt = Double.parseDouble(""+location.getLongitude());
                System.out.println("saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+AndroidGoogleMapsActivity.lats);
          //    ParseTweetsActivity.load();
                try 
                {
                    myList = myLocation.getFromLocation(location.getLatitude(),location.getLongitude(), 1);

                } catch (IOException e) {

                    e.printStackTrace();
                }

                if(myList!=null)
                {

                    Address address = (Address) myList.get(0);

                    addressStr = "";
                    addressStr += address.getAddressLine(0) + "\n";
                    addressStr += address.getAddressLine(1) + "\n";
                    addressStr += "Country name  "+address.getCountryName() + "\n";
                    addressStr += "Locality      "+address.getLocality() + "\n";
                    addressStr += "Country code  "+address.getCountryCode() + "\n";
                    addressStr += "Admin Area    "+address.getAdminArea() + "\n";
                    addressStr += "SubAdmin Area "+address.getSubAdminArea() + "\n";
                    addressStr += "PostalCode    "+address.getPostalCode() + "\n";

                //  txtv.append(location.getLatitude() + "    " + location.getLongitude() +"\n");
                //  txtv.append(addressStr+"\n");
                    System.out.println(location.getLatitude() + "    " + location.getLongitude() +"\n");
                    lm.removeUpdates(ll);
                }
            }
        }
        public void onProviderDisabled(String provider) 
        {
//              Toast.makeText(MyService.this,"Provider Disabled",Toast.LENGTH_LONG).show();
            txtv.setText("");
        }
        public void onProviderEnabled(String provider)
        {
//              Toast.makeText(MyService.this,"Provider Enabled.....",Toast.LENGTH_LONG).show();
        }
        public void onStatusChanged(String provider, int status, Bundle extras)
        {
        }
   }

}
4

3 に答える 3

1

TextView内でを宣言しましたService。それは良いことではありません。TextViewUIコンポーネントであり、サービスに属していません。

あなたのメソッドでは、がnullであるため、おそらくクラッシュするであろうonProviderDisabled()呼び出しを行います。これが、GPSを無効にしたときにアプリがクラッシュする理由である可能性があります。txtv.setText("");txtv

于 2012-06-11T12:52:22.653 に答える
0

コードをから変更します

lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
ll = new mylocationlistener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);

フォローする

lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
ll = new mylocationlistener();

if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){
      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0,ll);
    }
于 2012-06-11T12:57:58.637 に答える
0

onDestroy()でリスナーを解放しなかったときに、このような問題が発生しました。次のコードを追加してみてください。

lm.unregisterListener(ll);  
于 2012-06-11T13:16:41.023 に答える