gpt4 book ai didi

android - 如何在超时的情况下从 LocationManager 获取单个位置修复?

转载 作者:行者123 更新时间:2023-11-29 00:42:21 24 4
gpt4 key购买 nike

我正在使用 LocationManager 获取单个位置修复:

public class MyActivity extends Activity {
private LocationManager lm;
private ProgressDialog myDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
LocationListener ll = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1, 1, ll);
myDialog = ProgressDialog.show(this, null , "Determining Your Location", true);
}

class MyLocationListener implements LocationListener {
public void onLocationChanged(Location location) {
if (location != null) {
...

lm.removeUpdates(this);
myDialog.dismiss();
}
}
}
}

因此,如果无法找到位置修复,则监听位置可能会永远持续下去。我想通过在 60 秒后停止监听位置并向用户显示错误以告知无法确定他们的位置来为我的代码添加一些稳健性。

我该怎么做?

最佳答案

您可以使用 Handler , TimerAlarmManager通过调用 LocationManager.removeUpdates 停止监听来实现超时。

A Timer 创建一个新线程,这可能有点矫枉过正。 AlarmManager 的文档建议“(f) 或正常的计时操作(滴答、超时等)使用 Handler 更容易、更有效”。 Handler 的文档描述了 Handler 的主要用途之一是“安排消息和可运行对象在(原文如此)将来某个时间点执行。”

所有迹象都表明 Handler 是实现超时的最合适方法。

public class MyActivity extends Activity implements LocationListener {
private final int TIMEOUT = 60000;

private LocationManager myLocationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

myLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
myLocationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,
this, null);

Runnable myRunnable = new Runnable() {
public void run() {
myLocationManager.removeUpdates(QualityCheckActivity.this);
// other timeout error code
}
};

Handler myHandler = new Handler();
myHandler.postDelayed(myRunnable, TIMEOUT);
}

@Override
public void onLocationChanged(Location location) {
// location fixed code
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) { }

@Override
public void onProviderEnabled(String provider) { }

@Override
public void onProviderDisabled(String provider) { }
}

注意事项:

TIMEOUT 当然是以毫秒为单位的超时长度。在本例中为 60,000 毫秒,即 60 秒。

我选择在 MyActivity 本身上实现 LocationListener 接口(interface),这样 LocationListener 更容易在 Runnable< 中访问.

而不是调用 LocationManager.requestLocationUpdates : 我正在使用 LocationManager.requestSingleUpdate这将只提供一个位置修复。

我故意没有实现 Activity.onPauseActivity.onResume。如果 Activity 暂停,位置监听和超时都将继续。

关于android - 如何在超时的情况下从 LocationManager 获取单个位置修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8608889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com