如何在方法doInBackground中传递Latitude和Longitude参数?

时间:2014-11-21 17:58:51

标签: android android-asynctask reverse-geocoding

我尝试使用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)

3 个答案:

答案 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(..)中进一步使用的类数据成员。