2013-09-05 2 views
1

Обновление, см. Ниже.Как вернуть класс в onPostExecute?

Как вернуть класс ClassData и список объектов ArrayListOfObjects в onPostExecute()? Я хочу использовать его в своем пользовательском интерфейсе, и сейчас он находится в фоновом режиме в AsyncTask. Кроме того, я хочу, чтобы добавить маркеры с:

mMap.addMarker(new MarkerOptions() 
    .position(new LatLng(lati, longi)) 
    .title(name)); 

так что я могу добавить каждое новое местоположение на карте после каждого цикла.

Должен ли я поместить вышеуказанное в onPostExecute после возвращения класса LocationData?

try { 

     String apples = endpoint.listContactInfo().execute().toString(); 

     JSONObject jObject = new JSONObject(apples); 

     JSONArray jsonArr = jObject.getJSONArray("items"); 

     for (int i = 0; i < jsonArr.length(); i++) { 
      JSONObject jsonObj1 = jsonArr.getJSONObject(i); 

      // Storing each json item in variable 
      String id = jsonObj1.getString(TAG_ID); 
      String nameFirst1 = jsonObj1.getString(TAG_FIRSTNAME); 
      String nameLast1 = jsonObj1.getString(TAG_LASTNAME); 
      String emailAddress1 = jsonObj1.getString(TAG_EMAIL); 
      String streetAddress1 = jsonObj1.getString(TAG_ADDRESS); 
      String phone1 = jsonObj1.getString(TAG_PHONE); 

      // test to see if made it to string 
      Log.d("YOUR_TAG", "First Name: " + nameFirst1 + " Last Name: " 
        + nameLast1); 

      address = coder.getFromLocationName(streetAddress1, 5); 

      Address location1 = address.get(0); 

      // SET LAT LNG VALUES FOR MARKER POINT 

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

      Log.d("Location", "Location:" + lati + " " + longi); 

      class LocationData { 
       private double lat; 
       private double longitude; 
       private String name; 

       public LocationData(double lat, double longitude, 
         String name) { 
        this.lat = lat; 
        this.longitude = longitude; 
        this.name = name; 
       } 

       public void setLat(double lat) { 
        this.lat = lat; 
       } 

       public void setLongitude(double longitude) { 
        this.longitude = longitude; 
       } 

       public double getLat() { 
        return lat; 
       } 

       public double getLongitude() { 
        return longitude; 
       } 

       public void setName(String name) { 
        this.name = name; 
       } 

       public String getName() { 
        return name; 
       } 

      } 

      ArrayList<LocationData> listOfObjects = new ArrayList<LocationData>(); 

      listOfObjects.add(new LocationData(lati, longi, nameFirst1)); 

     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return (long) 0; 

} 

// WHAT DO I PUT HERE TO RETURN LocationData Class here 
// ADD MARKER TO MAP UI 
protected void onPostExecute() { 

    // mMap.addMarker(new MarkerOptions() 
    // .position(new LatLng(lati, longi)) 
    // .title("Hello world")); 

Это может показаться элементарным, но я создал этот метод: общественного ArrayList getLocationData() {

        ArrayList<LocationData> listOfObjects = new ArrayList<LocationData>(); 

           listOfObjects.add(new LocationData(lati, longi, nameFirst1)); 

           return listOfObjects; 
          } 

в моем классе LocationData. Затем я разместил LocationData.getLocationData(); с onPostExecute и я получаю LocationData не могут быть решены. В настоящее время код выглядит следующим образом:

try { 

    String apples = endpoint.listContactInfo().execute().toString(); 

    JSONObject jObject = new JSONObject(apples); 

    JSONArray jsonArr = jObject.getJSONArray("items"); 

    for(int i =0 ; i<jsonArr.length() ;i++){ 
     JSONObject jsonObj1 = jsonArr.getJSONObject(i); 


        // Storing each json item in variable 
        String id = jsonObj1.getString(TAG_ID); 
        final String nameFirst1 = jsonObj1.getString(TAG_FIRSTNAME); 
        String nameLast1 = jsonObj1.getString(TAG_LASTNAME); 
        String emailAddress1 = jsonObj1.getString(TAG_EMAIL); 
        String streetAddress1 = jsonObj1.getString(TAG_ADDRESS); 
        String phone1 = jsonObj1.getString(TAG_PHONE); 

        //test to see if made it to string 
        Log.d("YOUR_TAG", "First Name: " + nameFirst1 + " Last Name: " + nameLast1); 

         address = coder.getFromLocationName(streetAddress1,5); 

         Address location1 = address.get(0); 

         // SET LAT LNG VALUES FOR MARKER POINT 

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

         Log.d("Location", "Location:" + lati + " " + longi); 


         class LocationData { 
          private double lat; 
          private double longitude; 
          private String name; 

          public LocationData(double lat, double longitude, String name) { 
           this.lat = lat; 
           this.longitude = longitude; 
           this.name = name; 
          } 

          public void setLat(double lat) { 
           this.lat = lat; 
          } 

          public void setLongitude(double longitude) { 
           this.longitude = longitude; 
          } 

          public double getLat() { 
           return lat; 
          } 

          public double getLongitude() { 
           return longitude; 
          } 

          public void setName(String name) { 
            this.name = name; 
           } 

          public String getName() { 
           return name; 



           } 

          public ArrayList<LocationData> getLocationData() { 

           ArrayList<LocationData> listOfObjects = new ArrayList<LocationData>(); 

           listOfObjects.add(new LocationData(lati, longi, nameFirst1)); 

           return listOfObjects; 
          } 

          } 

    } 

    } catch (IOException e) { 
    e.printStackTrace(); 
    } catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
     return (long) 0; 


    } 
    //WHAT DO I PUT HERE TO RETURN LocationData Class here 
     // ADD MARKER TO MAP UI 
    protected void onPostExecute(Long result) { 

        //CANT BE RESOLVED 
     LocationData.getLocationData(); 

     //mMap.addMarker(new MarkerOptions() 
     //.position(new LatLng(lati, longi)) 
     // .title("Hello world")); 

Вот мои изменения, основанные на рекомендациях @Sustain. Кажется, у меня сейчас нет карточных маркеров. Кто-нибудь что-нибудь видит?

public class FinderActivity extends Activity implements LocationListener { 


GoogleMap mMap; 
Location myLocation; 
EditText length; 
String lengthString; 
LocationManager locationmanager; 
double lati; 
double longi; 
String nameFirst1; 
//Spinner s; 

    List<Address> address; 
    Geocoder coder = new Geocoder(this); 
private static final String TAG_ID = "id"; 
private static final String TAG_FIRSTNAME = "nameFirst"; 
private static final String TAG_LASTNAME = "nameLast"; 
private static final String TAG_EMAIL = "emailAddress"; 
private static final String TAG_ADDRESS = "streetAddress"; 
private static final String TAG_STATE = "state"; 

private static final String TAG_PHONE = "phone"; 
JSONArray contacts = null; 


private static class LocationData { 
    private double lat; 
    private double longitude; 
    private String name; 

    public LocationData(double lat, double longitude, String name) { 
     this.lat = lat; 
     this.longitude = longitude; 
     this.name = name; 
    } 

    public void setLat(double lat) { 
     this.lat = lat; 
    } 

    public void setLongitude(double longitude) { 
     this.longitude = longitude; 
    } 

    public double getLat() { 
     return lat; 
    } 

    public double getLongitude() { 
     return longitude; 
    } 

    public void setName(String name) { 
      this.name = name; 
     } 

    public String getName() { 
     return name; 

     } 

    } 

@SuppressLint("NewApi") 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.maps); 
    mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
    if (mMap!= null) { 

     mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 


     mMap.setMyLocationEnabled(true); 
     mMap.animateCamera(CameraUpdateFactory.zoomBy(17)); 

     } 

    LocationManager locationmanager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    Criteria cr = new Criteria(); 
    String provider = locationmanager.getBestProvider(cr, true); 

    Location location = locationmanager.getLastKnownLocation(provider); 

    locationmanager.requestLocationUpdates(provider, 20, 0, (LocationListener) this); 

    mMap.moveCamera(CameraUpdateFactory.newLatLng((new LatLng(location.getLatitude(), location.getLongitude())))); 


    new EndpointsTask().execute(getApplicationContext()); 

} 

public class EndpointsTask extends AsyncTask<Context, LocationData, Long> { 

    private List<LocationData> locationList = new ArrayList<LocationData>(); 

    public Long doInBackground(Context... contexts) { 

     Contactinfoendpoint.Builder endpointBuilder = new Contactinfoendpoint.Builder(
      AndroidHttp.newCompatibleTransport(), 
      new JacksonFactory(), 
      new HttpRequestInitializer() { 
      public void initialize(HttpRequest httpRequest) { } 
      }); 
    Contactinfoendpoint endpoint = CloudEndpointUtils.updateBuilder(
    endpointBuilder).build(); 

    try { 

    String apples = endpoint.listContactInfo().execute().toString(); 

    JSONObject jObject = new JSONObject(apples); 

    JSONArray jsonArr = jObject.getJSONArray("items"); 

    for(int i =0 ; i<jsonArr.length() ;i++){ 
     JSONObject jsonObj1 = jsonArr.getJSONObject(i); 


        // Storing each json item in variable 
        String id = jsonObj1.getString(TAG_ID); 
        String nameFirst1 = jsonObj1.getString(TAG_FIRSTNAME); 
        String nameLast1 = jsonObj1.getString(TAG_LASTNAME); 
        String emailAddress1 = jsonObj1.getString(TAG_EMAIL); 
        String streetAddress1 = jsonObj1.getString(TAG_ADDRESS); 
        String phone1 = jsonObj1.getString(TAG_PHONE); 

        //test to see if made it to string 
        Log.d("YOUR_TAG", "First Name: " + nameFirst1 + " Last Name: " + nameLast1); 

         address = coder.getFromLocationName(streetAddress1,5); 

         Address location1 = address.get(0); 

         // SET LAT LNG VALUES FOR MARKER POINT 

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

         Log.d("Location", "Location:" + lati + " " + longi); 

         LocationData data = new LocationData(lati, longi, nameFirst1); 
         locationList.add(data); 
         publishProgress(data); 

    } 

    } catch (IOException e) { 
    e.printStackTrace(); 
    } catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
     return (long) 0; 

    } 

    protected void onProgressUpdate(LocationData data) { 
     // Add Marker on Map using data. This is called by 
     // publishProgress(LocationData) on the UI Thread. 
     mMap.addMarker(new MarkerOptions() 
     .position(new LatLng(lati, longi)) 
     .title(nameFirst1)); 

     Log.d("bananas", lati + longi + nameFirst1); 
    } 

    //WHAT DO I PUT HERE TO RETURN LocationData Class here 
     // ADD MARKER TO MAP UI 
    protected void onPostExecute() { 

    } 

    } 

ответ

1

Класс LocationData определяется внутри недостижимой области. Вместо этого, определить его в его собственном файле .java так:

class LocationData { 
    // final Fields 
    // Constructor 
    // Getters 
} 

или как частный статический класс вашего крайнего класса, если вы не используете его в другом месте.

Тогда для подкласса AsyncTask вы могли бы иметь что-то вроде:

private class AsyncJsonTask extends AsyncTask<Param, LocationData, Void> 
{ 
    private List<LocationData> locationList = new ArrayList<LocationData>(); 
    // ... 
    protected void doInBackground(Param) { 
     // ... 
     for (int i = 0; i < jsonArr.length(); i++) { 
      // Do your stuff with JSon Objects 
      // ... 
      // Instanciate a new LocationData and pass it as progress: 
      LocationData data = new LocationData(latitude, longitude, name); 
      locationList.add(data); 
      publishProgress(data); 
     } 
    } 

    protected void onProgressUpdate(LocationData data) { 
     // Add Marker on Map using data. This is called by 
     // publishProgress(LocationData) on the UI Thread. 
     mMap.addMarker(/* marker */); 
    } 

    protected void onPostExecute() { 
     // Assign outer class member field the value of the builded list 
     // for future reference. 
     mLocationList = locationList; 
    } 
} 

Таким образом, вы можете опубликовать каждый маркер индивидуально на карте до загрузки следующего.

В качестве примечания следует изучить значение статических методов и полей; ваш звонок до LocationData.getLocationData() недействителен.

+0

Спасибо. Я поместил код, как указано выше. Однако я не получаю никаких маркеров карты. – johnsonjp34

+1

В 'onProgressUpdate()' вы должны использовать аргумент 'data', чтобы получить свою широту и долготу, такие как' data.getLatitude() ', чтобы построить свою позицию маркера. Он побеждает purpuse AsyncTask для доступа к вашим переменным Activity непосредственно из 'doInBackgroud()' (т. Е. Когда вы делаете 'lati = location1.getLatitude();'. Объявляйте _local variables_ вместо хранения своих данных.).Наконец, как указано в примере, используйте список членов вашей деятельности, чтобы получить ссылку на исходные данные до того, как AsyncTask будет GCed. – Sustain

1

onPostExecute работает в потоке пользовательского интерфейса. Поэтому любые изменения в UX можно сделать здесь, в вашем случае, добавив маркеры на карту.

onPostExecute принимает параметр результата, возвращаемый из doInBackground().

Вы можете узнать больше о AsyncTask из http://developer.android.com/reference/android/os/AsyncTask.html

Он получил хороший пример, как хорошо.

+0

Я, похоже, не могу разрешить ссылку на класс LocationData внутри onPostExecute. – johnsonjp34

Смежные вопросы