android定位并获取城市,异步线程,完整代码
时间: 2023-06-13 12:07:02 浏览: 52
以下是一个获取当前位置并获取城市的异步线程的完整代码示例:
```java
import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.util.Log;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
public class GetCityAsyncTask extends AsyncTask<Void, Void, String> {
private Context mContext;
private OnCityListener mListener;
public GetCityAsyncTask(Context context, OnCityListener listener) {
mContext = context;
mListener = listener;
}
@Override
protected String doInBackground(Void... voids) {
String city = "";
try {
LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
if (addresses.size() > 0) {
city = addresses.get(0).getLocality();
}
}
} catch (IOException e) {
Log.e("GetCityAsyncTask", "IOException", e);
} catch (Exception e) {
Log.e("GetCityAsyncTask", "Exception", e);
}
return city;
}
@Override
protected void onPostExecute(String city) {
mListener.onCity(city);
}
public interface OnCityListener {
void onCity(String city);
}
}
```
在这个示例中,我们使用了`LocationManager`来获取设备的位置,并使用`Geocoder`将位置转换为可读的地址。然后,我们从地址中提取城市名称并将其返回给主线程。
使用此异步任务的示例代码如下:
```java
GetCityAsyncTask task = new GetCityAsyncTask(MainActivity.this, new GetCityAsyncTask.OnCityListener() {
@Override
public void onCity(String city) {
// 在此处处理城市名称
}
});
task.execute();
```
在此处,我们创建了`GetCityAsyncTask`实例并调用`execute()`方法来启动异步任务。在任务完成后,将调用`onCity()`方法,该方法将城市名称作为字符串参数传递。