我尝试使用AsyncTask进行反向地理编码,但是通过方法doInBackground()的纬度和经度参数没有正确发生。任何想法?
public class SitesAdapter extends ArrayAdapter<StackSite> {
public static Double lat;
public static Double lng;
@Override
public View getView(int pos, View convertView, ViewGroup parent){
...
lat = -1.80;
lng = -80.20;
...
}
public void start(){
new GetAddressTask(mContext).execute(lat, lng);
}
public static class GetAddressTask extends AsyncTask<Double, Void, String> {
//mContext
@Override
protected String doInBackground(Double... params) {
Geocoder gc = new Geocoder(mContext, Locale.getDefault());
List<Address> list = null;
String city = "";
double latitude = params[0];
double longitude = params[1];
try {
list = gc.getFromLocation(lat, lng, 1);
} catch (IOException e) {
e.printStackTrace();
}
if (list != null && list.size() > 0) {
Address address = list.get(0);
city = String.format("%s, %s", address.getAdminArea(), address.getCountryName());
}
return city;
}
@Override
protected void onPostExecute(String city) {
tituloTxt.setText(city);
}
}
}
错误:
11-21 15:10:24.409: E/Trace(24502): error opening trace file: No such file or directory (2)
答案 0 :(得分:1)
之后好了,所以只需要通过坐标就可以了。首先将坐标添加到构造函数LatLng(双纬度,双经度)并传递参数。
lat = -1.80;
lng = -80.20;
LatLng latlng = new LatLng(lat, lng);
new GetAddressTask(mContext).execute(lat, lng);
然后在doInbackground方法内获取参数。
public static class GetAddressTask extends AsyncTask<LatLng, Void, String> {
//mContext
@Override
protected String doInBackground(LatLng... params) {
Geocoder gc = new Geocoder(mContext, Locale.getDefault());
List<Address> list = null;
String city = "";
LatLng loc = params[0]; //Get all parameters: latitude and longitude
try {
list = gc.getFromLocation(loc.latitude, loc.longitude, 1); //get specific parameters
} catch (IOException e) {
e.printStackTrace();
}
if (list != null && list.size() > 0) {
Address address = list.get(0);
city = String.format("%s, %s", address.getAdminArea(), address.getCountryName());
return city;
}else{
return "City no found";
}
}
@Override
protected void onPostExecute(String city) {
tituloTxt.setText(city);
}
}
答案 1 :(得分:-1)
在您的类中添加两个变量,并在创建异步任务时设置它们,然后在方法中使用它们。简单。
public class GetAddressTask extends AsyncTask<String, Void, String> {
Context mContext;
float lat,lin;
public void setLat(int lat){...}
//rest of class
当然你可以让一切都变得静止(字段和设置者)。
编辑。
如果使用某些参数调用execute,请记住在调用execute之前必须设置值。
答案 2 :(得分:-1)
在调用execute方法之前,你可以创建一个构造函数,在其中你可以初始化你可以在doInBackground(..)中进一步使用的类数据成员。