Android 如何使用AsyncTask获取位置
我正在努力寻找解决这个问题的好办法。我制作了我的应用程序,以便它找到我的位置。这似乎过于复杂,但足够简单。不过,按照谷歌的建议,我现在尝试将此代码作为异步任务运行,这样就不会占用UI。然而,我甚至不知道如何编译代码,更不用说实际运行了。错误在于,当我引用locationManager以删除侦听器时,无法解决该问题。我试过使用这里发布的代码。然而,在这个例子中,currentLocation似乎并没有被引用到任何东西,我在试图解决这个问题时遇到了问题。我已经浪费了将近一整天的时间来解决这个问题,所以如果有人能给我指出正确的方向,我将不胜感激Android 如何使用AsyncTask获取位置,android,location,android-asynctask,Android,Location,Android Asynctask,我正在努力寻找解决这个问题的好办法。我制作了我的应用程序,以便它找到我的位置。这似乎过于复杂,但足够简单。不过,按照谷歌的建议,我现在尝试将此代码作为异步任务运行,这样就不会占用UI。然而,我甚至不知道如何编译代码,更不用说实际运行了。错误在于,当我引用locationManager以删除侦听器时,无法解决该问题。我试过使用这里发布的代码。然而,在这个例子中,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();
}
}
私有类LocationControl扩展了异步任务{
公共场所选址;
私人场所管理者场所管理者;
@凌驾
公共位置doInBackground(上下文…参数){
locationManager=(locationManager)参数[0]。getSystemService(Context.LOCATION\u服务);
locationManager.RequestLocationUpdate(locationManager.GPS\提供程序,0,0,locationListener);
返回位置;
}
public LocationListener LocationListener=new LocationListener(){
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){}
公共无效onProviderEnabled(字符串提供程序){}
公共无效onProviderDisabled(字符串提供程序){}
public void onLocation已更改(android.location.location mlocation){
保存位置(mlocation);
locationManager.RemoveUpdate(locationListener);
}
};
void saveLocation(android.location.location){
位置=位置;
}
@凌驾
受保护的void onPostExecute(位置结果){
使用位置(结果);
super.onPostExecute(结果);
}
@凌驾
受保护的void onPreExecute(){
显示(wassersortlotse.this,“,“查找位置…”);
super.onPreExecute();
}
}
所以我用你的建议修改了代码,现在它可以编译了。我已经更新了这里的代码来表示我正在运行的内容。当locationManager请求SlocationUpdate时,我收到一个运行时错误。这是航海日志。有什么想法吗
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
04-15 14:57:56.742:错误/AndroidRuntime(18328):未捕获处理程序:线程异步任务#1由于未捕获异常而退出
04-15 14:57:56.942:错误/AndroidRuntime(18328):java.lang.RuntimeException:执行doInBackground()时出错
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在android.os.AsyncTask$3.done(AsyncTask.java:200)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.lang.Thread.run(Thread.java:1060)处
04-15 14:57:56.942:错误/AndroidRuntime(18328):原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):位于android.os.Handler.(Handler.java:121)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在android.location.LocationManager$ListenerTransport$1。(LocationManager.java:128)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在android.location.LocationManager$ListenerTransport。(LocationManager.java:126)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在android.location.LocationManager.\u请求locationupdates(LocationManager.java:697)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在android.location.LocationManager.RequestLocationUpdate(LocationManager.java:619)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):位于com.wassersortlotse.wassersortlotse$LocationControl.doInBackground(wassersortlotse.java:62)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):位于com.wassersortlotse.wassersortlotse$LocationControl.doInBackground(wassersortlotse.java:1)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):位于android.os.AsyncTask$2.call(AsyncTask.java:185)
04-15 14:57:56.942:ERROR/AndroidRuntime(18328):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256)
04-15 14:57:56.942:错误/AndroidRuntime(18328):。。。4更多
04-15 14:58:23.451:错误/AndroidRuntime(18356):未捕获处理程序:线程异步任务#1由于未捕获异常而退出
04-15 14:58:23.642:错误/AndroidRuntime(18356):java.lang.RuntimeException:执行doInBackground()时出错
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):在android.os.AsyncTask$3.done(AsyncTask.java:200)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):在java.util.concurrent.FutureTask.run(FutureTask.java:122)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673)
04-15 14:58:23.642:ERROR/AndroidRuntime(18356):在java.lang.Thread.run(Thread.java:10)处
LocationManager locationManager = (LocationManager)params[0].getSystemService(Context.LOCATION_SERVICE);
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");
}
}
}
}
public Location getLocation()
{
try
{
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled)
{
// no network provider is enabled
Log.w("DOCOMO-2","Network Connection failed");
}
else
{
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled)
{
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null)
{
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null)
{
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled)
{
if (location == null)
{
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null)
{
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null)
{
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
locationManager=null;
location=null;
}
catch (Exception e)
{
locationManager=null;
location=null;
e.printStackTrace();
}
return location;
}