gpt4 book ai didi

android - 在 Android 的后台线程中运行 GPS 定位

转载 作者:行者123 更新时间:2023-11-29 14:05:35 30 4
gpt4 key购买 nike

我有一个奇怪的问题,在我的应用程序中,GPS 定位需要相当长的时间(通常如此),因此我想在用户在其他 View 中做出选择时将其作为自己的线程运行。

我的结构是,我有一个在后台始终处于 Activity 状态的“主” View ,然后向用户显示一系列 View ,用户可以在其中做出一些选择。最后,根据所做的选择和当前位置向用户呈现结果。所有这些都有效,但我想将 GPS 位移动到它自己的线程中,这样用户就不必等待它完成。

所有用户的选择和 GPS 坐标都存储在一个名为 CurrentLogEntry 的单例中。程序不同部分之间的所有通信都是通过它执行的。

我在主视图中创建了一个 handleMessage(Message msg) 覆盖,然后我在 Main.java 中实现了这个函数:

void startGPSThread() {
Thread t = new Thread() {

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean isDebug = CurrentLogEntry.getInstance().isDebug();

// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {

public void onStatusChanged(String provider, int status, Bundle extras) {
/* This is called when the GPS status changes */
String tag = "onStatusChanged, ";
switch (status) {
case LocationProvider.OUT_OF_SERVICE:
Log.w(tag, "Status Changed: Out of Service");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.w(tag, "Status Changed: Temporarily Unavailable");
break;
case LocationProvider.AVAILABLE:
break;
}
}

public void onProviderEnabled(String provider) {
}

public void onProviderDisabled(String provider) {
// This is called if the GPS is disabled in settings.
// Bring up the GPS settings
Intent intent = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}

public void onLocationChanged(Location location) {

// Once a location has been received, ignore all other position
// updates.
locationManager.removeUpdates(locationListener);
locationManager.removeUpdates(this);

// Make sure that the received location is a valid one,
// otherwise show a warning toast and hit "back".
if (location == null) {
String warningString = "Location was unititialized!";

if (isDebug) {
Toast.makeText(getApplicationContext(),
warningString,
Toast.LENGTH_LONG).show();
}

KeyEvent kev = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
onKeyDown(KeyEvent.KEYCODE_BACK, kev);
}

CurrentLogEntry.getInstance().setUserLatitude(location.getLatitude());
CurrentLogEntry.getInstance().setUserLongitude(location.getLongitude());

//Send update to the main thread
int result = 0;
if (location.getLatitude() == 0 || location.getLongitude() == 0) {
result = -1;
}

messageHandler.sendMessage(Message.obtain(messageHandler, result));
}
};

@Override
public void run() {

locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0, locationListener);

// Wait until a position has bee acquired.
while(!CurrentLogEntry.getInstance().isReadyToCalculate()){
try {
wait(250);
} catch (InterruptedException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
};

t.start();
}

此函数在 Main.onCreate() 中调用。

不幸的是,这根本不起作用。程序一到达 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 就崩溃了,这让我完全难住了。

谁能告诉我为什么它不能作为后台线程运行?另外,我真的需要最后的等待轮询来确保线程在接收到数据之前保持 Activity 状态吗?在我想将它放入自己的线程之前,GPS 位工作得很好,那么我究竟做错了什么?

最佳答案

据我了解,您必须将 Thread 设置为 Looper 线程才能在后台运行位置更新...但是我仍在尝试自己解决这个问题...当我弄清楚如何执行此操作时,我将发布它。

可能有与我收到的相同的错误,即无法在尚未调用 Looper.prepare() 的线程中创建处理程序

希望你能成功

关于android - 在 Android 的后台线程中运行 GPS 定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7254406/

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