2012-11-15 122 views
0

我需要停止位置侦听器更新。我知道,为了阻止一个位置监听器我需要调用locationManager.removeUpdates(LocationListener)但我不断收到的MyLocationListener cannot be resolved to a variable停止位置侦听器

这里的错误是我的代码有:

import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.apache.http.protocol.HTTP; 
import org.apache.http.util.EntityUtils; 

import android.app.Activity; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class GetCoords extends Activity { 

    private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; //in Meters 
    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 10000; //in Milliseconds 

    protected LocationManager locationManager; 

    protected Button getLocationButton; 
    protected Button stopLocationButton; 


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

     getLocationButton = (Button) findViewById(R.id.get_location_button); 
     stopLocationButton = (Button) findViewById(R.id.stop_location_button); 

     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

     locationManager.requestLocationUpdates(
       LocationManager.GPS_PROVIDER, 
       MINIMUM_TIME_BETWEEN_UPDATES, 
       MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
       new MyLocationListener() 
     ); 

     getLocationButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       showCurrentLocation(); 
      //String message = "GPS Service Started"; 
      Toast.makeText(GetCoords.this, "GPS Service Started", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    stopLocationButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      stopMyLocation(); 
      //locationManager = null; 
      //stopCurrentLocation(); 
      Toast.makeText(GetCoords.this, "GPS Service Stopped", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
     } 

protected void stopMyLocation() { 
    locationManager.removeUpdates(MyLocationListener); 
      locationManager = null; 
} 

我不明白我在做什么错误的,我已经看到了关于如何停止GPS更新的每个例子,这让我认为我在stopMyLocation()下的代码是正确的。我已经在stopLocationButton点击侦听器的内部尝试了它,它在当前位置,几乎在任何地方,它一直告诉我MyLocationListener不正确。

回答

2

保存参考,您的LocationListener的:

protected LocationManager locationManager; 
protected MyLocationListener myLocationListener = new MyLocationListener(); 

更改此:

locationManager.requestLocationUpdates(
      LocationManager.GPS_PROVIDER, 
      MINIMUM_TIME_BETWEEN_UPDATES, 
      MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
      myLocationListener 
    ); 

现在,您可以将其取消:

locationManager.removeUpdates(myLocationListener); 
+0

现在位于locationManager.requestLocationUpdates中的myLocationListener(部分突出显示红色,并说:“方法myLocationListener()未定义类型GetCoords”。应用程序的名称是GetCoords,因此您知道该作品的来源。我开始认为Java只是超出了我的能力,我大部分都理解你对我的代码的更正,但不明白为什么它仍然不起作用。 –

+0

从'myLocationListener()'中删除该对象,使它简单地成为'myLocationListener'或者,如果我只是按照你的确切指令而不是假设我知道我是什么,那么你可能会想要调用一个像stopMyLocation()这样的方法来访问一个没有括号的变量 – Sam

+0

在做我会一直很好。我有myLocationListener(),这是不正确的,根据你告诉我它是不是ded是myLocationListener,没有括号。非常感谢你的帮助。 –

3

您需要分配您的位置监听器一场..如

protected MyLocationListener listener; 

然后在您的onCreate:然后

listener = new MyLocationListener(); 

locationManager.requestLocationUpdates(
       LocationManager.GPS_PROVIDER, 
       MINIMUM_TIME_BETWEEN_UPDATES, 
       MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
       listener); 

你的注销将看起来像

locationManager.removeUpdates(listener); 
+0

很好的答案!少于三秒钟...有一个upvote! – Sam

+0

一个给你! haha – dymmeh

+0

非常感谢您的帮助,我将@Sam标记为正确的答案,仅仅是因为它是第一个,但我也尝试了您的解决方案,并且它的工作原理同样完美。十分感谢你的帮助。 –

1

你已经初始化MyLocationListener,但它不分配给一个变量供以后使用。 Java如何知道您在removeUpdates()调用中引用的MyLocationListener类的哪个实例?

  1. 使一个类变量LocationListener abc;

  2. onCreate()方法添加行ABC =新MyLocationListener();在您注册更新之前。

  3. 将此传递给您的requestLocationUpdates()方法。

  4. 在您的stopMyLocation()方法中调用removeUpdates(abc)

+0

感谢您的帮助,即使它已经解决了,我也非常感谢您的帮助,但确实看起来好像这种方法的效果一样好,但我认为现在我完成了对代码的殴打。 –

1

因为stopMyLocation()函数传递未知变量MyLocationListener到removeUpdates你得到的错误:

locationManager.removeUpdates(MyLocationListener); 

要通过现有的变量removeUpdates你必须定义MyLocationListener类的对象变量,可以通过onCreate()和stopMyLocation()函数访问。

private MyLocationListener locationListener; 

的LocationListener的变量可以在OnCreate()函数被实例化,并且必须用来调用requestLocationUpdates(...)的功能。

locationListener = new MyLocationListener(); 

locationManager.requestLocationUpdates(
      LocationManager.GPS_PROVIDER, 
      MINIMUM_TIME_BETWEEN_UPDATES, 
      MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
      locationListener 
    ); 
+0

非常感谢您的回复,我非常感谢。 –

0

我也有同样的问题。我认为我的问题与上面提到的问题类似,只要创建了不同的侦听器实例即可。我最终做的是创建一个静态侦听器并创建一个单例方法来防止创建另一个侦听器实例。该代码看起来是这样的:

static LocationListener mLocationListener = null; 

public LocationListener getLocationListener(){ 
    if(mLocationListener==null) 
     mLocationListener = new MyLocationListener(); 
    return mLocationListener; 
} 

然后我用这种方式

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000 * 2, 0, getLocationListener()); 

locationManager.removeLocationUpdates(getLocationListener()); 

如有必要,你可以做同样的事情用的LocationManager,但我没有太。希望这可以帮助!