gpt4 book ai didi

android - 如何使用 AsyncTask 获取位置

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:33 24 4
gpt4 key购买 nike

我正在努力寻找解决这个问题的好方法。我制作了我的应用程序,以便它找到我的位置。这似乎过于复杂但很容易。然而,根据谷歌的建议,我现在正在尝试将此代码作为异步任务运行,因此它不会占用 UI。但是我什至不知道如何让代码编译更不用说实际运行了。错误是当我引用它来删除监听器时无法解析 locationManager。我尝试使用此处发布的代码 Android find GPS location once, show loading dialog .然而,在这个例子中,currentLocation 似乎没有被引用到任何东西,我在试图解决这个问题时遇到了问题。我已经浪费了将近一整天的时间来解决这个问题,所以如果有人能指出我正确的方向,我将不胜感激。

private class LocationControl extends AsyncTask<Context, Void, Location> {
public Location alocation;
private LocatoinManager locationManager;

@Override
public Location doInBackground(Context... params) {
locationManager = (LocationManager) params[0].getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 0, 0, locationListener);
return alocation;
}

public LocationListener locationListener = new LocationListener() {

public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}

public void onLocationChanged(android.location.Location mlocation) {
saveLocation(mlocation);
locationManager.removeUpdates(locationListener);
}
};

void saveLocation(android.location.Location location){
alocation = location;
}

@Override
protected void onPostExecute(Location result) {
useLocation(result);
super.onPostExecute(result);
}

@Override
protected void onPreExecute() {
dialog.show(WasserSportLotse.this, " ", "Finding location...");

super.onPreExecute();
}
}

所以我根据您的建议更改了代码,现在可以编译了。我已经更新了此处的代码以表示我正在运行的内容。当 locationManager 请求位置更新时,我收到运行时错误。这是 logCat。有什么想法吗?

04-15 14:57:56.742: ERROR/AndroidRuntime(18328): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): java.lang.RuntimeException: An error occured while executing doInBackground()
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.lang.Thread.run(Thread.java:1060)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.os.Handler.<init>(Handler.java:121)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:128)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:126)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:697)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:619)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:62)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:1)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): ... 4 more
04-15 14:58:23.451: ERROR/AndroidRuntime(18356): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): java.lang.RuntimeException: An error occured while executing doInBackground()
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.lang.Thread.run(Thread.java:1060)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.os.Handler.<init>(Handler.java:121)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:128)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:126)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:697)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:619)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:62)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:1)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): ... 4 more

最佳答案

public class FastMainActivity extends Activity {

Button searchBtn = null;
Intent locatorService = null;
AlertDialog alertDialog = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
searchBtn = (Button) findViewById(R.id.searchBtn);

searchBtn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

if (!startService()) {
CreateAlert("Error!", "Service Cannot be started");
} else {
Toast.makeText(FastMainActivity.this, "Service Started",
Toast.LENGTH_LONG).show();
}

}
});

}

public boolean stopService() {
if (this.locatorService != null) {
this.locatorService = null;
}
return true;
}

public boolean startService() {
try {
// this.locatorService= new
// Intent(FastMainActivity.this,LocatorService.class);
// startService(this.locatorService);

FetchCordinates fetchCordinates = new FetchCordinates();
fetchCordinates.execute();
return true;
} catch (Exception error) {
return false;
}

}

public AlertDialog CreateAlert(String title, String message) {
AlertDialog alert = new AlertDialog.Builder(this).create();

alert.setTitle(title);

alert.setMessage(message);

return alert;

}

public class FetchCordinates extends AsyncTask<String, Integer, String> {
ProgressDialog progDailog = null;

public double lati = 0.0;
public double longi = 0.0;

public LocationManager mLocationManager;
public VeggsterLocationListener mVeggsterLocationListener;

@Override
protected void onPreExecute() {
mVeggsterLocationListener = new VeggsterLocationListener();
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

mLocationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0,
mVeggsterLocationListener);

progDailog = new ProgressDialog(FastMainActivity.this);
progDailog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
FetchCordinates.this.cancel(true);
}
});
progDailog.setMessage("Loading...");
progDailog.setIndeterminate(true);
progDailog.setCancelable(true);
progDailog.show();

}

@Override
protected void onCancelled(){
System.out.println("Cancelled by user!");
progDialog.dismiss();
mLocationManager.removeUpdates(mVeggsterLocationListener);
}

@Override
protected void onPostExecute(String result) {
progDailog.dismiss();

Toast.makeText(FastMainActivity.this,
"LATITUDE :" + lati + " LONGITUDE :" + longi,
Toast.LENGTH_LONG).show();
}

@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub

while (this.lati == 0.0) {

}
return null;
}

public class VeggsterLocationListener implements LocationListener {

@Override
public void onLocationChanged(Location location) {

int lat = (int) location.getLatitude(); // * 1E6);
int log = (int) location.getLongitude(); // * 1E6);
int acc = (int) (location.getAccuracy());

String info = location.getProvider();
try {

// LocatorService.myLatitude=location.getLatitude();

// LocatorService.myLongitude=location.getLongitude();

lati = location.getLatitude();
longi = location.getLongitude();

} catch (Exception e) {
// progDailog.dismiss();
// Toast.makeText(getApplicationContext(),"Unable to get Location"
// , Toast.LENGTH_LONG).show();
}

}

@Override
public void onProviderDisabled(String provider) {
Log.i("OnProviderDisabled", "OnProviderDisabled");
}

@Override
public void onProviderEnabled(String provider) {
Log.i("onProviderEnabled", "onProviderEnabled");
}

@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
Log.i("onStatusChanged", "onStatusChanged");

}

}

}

}

关于android - 如何使用 AsyncTask 获取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5676653/

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