Android - 在OnCreate中获取doInBackground的结果

时间:2013-11-13 06:43:53

标签: android android-intent arraylist

我正在为MapActivity上课,我解析webservice并获得arraylist作为返回值。我希望arraylist方法中的OnCreate通过点击Intent

传递到下一个Button

我的代码是:

package com.demo.map;

import java.util.ArrayList;

import android.app.ActionBar;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;

import com.demo.map.R;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends Fragment{

private GoogleMap mMap;
private String[] places = {"ATM|Hospital|Police|Restaurant"};
public LocationManager locationManager;
public Location loc;
Place placeDetail;

public static final String TAG = "MainActivity";

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    //super.onCreate(savedInstanceState);
    final View v = inflater.inflate(R.layout.activity_sub_main, container, false);

    mMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();


    locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);

    String provider = locationManager.getBestProvider(new Criteria(), false);

    Location location = locationManager.getLastKnownLocation(provider);

    if (location == null)
    {
        locationManager.requestLocationUpdates(provider, 0, 0, listener);
    }
    else
    {
        loc = location;
        new GetPlaces(getActivity(), places[0].toLowerCase().replace("-", "_")).execute();
        Log.e(TAG, "location : " + location);
    }



    Button camera_btn = (Button) v.findViewById(R.id.map_activity_cam_button);

    camera_btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            Intent i = new Intent(getActivity(),Compass.class);
               // pass arraylist by clicking on this button. I want resulted arraylist from doInBackground.. i.e. *findplaces*
            startActivity(i);

        }
    });
    return v;

}   

private class GetPlaces extends AsyncTask<Void, Void, ArrayList<Place>> {

    private ProgressDialog dialog;
    private Context context = getActivity();
    private String places;

    public GetPlaces(Activity act, String places) {
        this.context = act;
        this.places = places;
    }

    @Override
    protected void onPostExecute(ArrayList<Place> result) {
        super.onPostExecute(result);
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
        for (int i = 0; i < result.size(); i++)
        {
            mMap.addMarker(new MarkerOptions()
                    .title(result.get(i).getName())
                    .position(new LatLng(result.get(i).getLatitude(), result.get(i).getLongitude()))
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.google_pin_new))
                    .snippet(result.get(i).getVicinity()));
        }
        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target(new LatLng(result.get(0).getLatitude(), result.get(0).getLongitude()))
                // Sets the center of the map to Mountain View
                .zoom(14) // Sets the zoom
                .tilt(30) // Sets the tilt of the camera to 30 degrees
                .build(); // Creates a CameraPosition from the builder
        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(context);
        dialog.setCancelable(false);
        dialog.setMessage("Loading..");
        dialog.isIndeterminate();
        dialog.show();
    }

    @Override
    protected ArrayList<Place> doInBackground(Void... arg0) {
        PlacesService service = new PlacesService(
                "AIzaSyAmllugM0BoCNosipmHpw1picM2a1XNOEA");
        ArrayList<Place> findPlaces = service.findPlaces(loc.getLatitude(), // 28.632808
                loc.getLongitude(), places); // 77.218276

        for (int i = 0; i < findPlaces.size(); i++) {

            placeDetail = findPlaces.get(i);
            Log.e(TAG, "places : " + placeDetail.getName());
        }
        return findPlaces;
    }

}

private LocationListener listener = new LocationListener() {

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }

    @Override
    public void onLocationChanged(Location location) {
        Log.e(TAG, "location update : " + location);
        loc = location;
        locationManager.removeUpdates(listener);
    }
};

    }

放置课程

public class Place {
private String id;
private String icon;
private String name;
private String vicinity;
private Double latitude;
private Double longitude;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getIcon() {
    return icon;
}

public void setIcon(String icon) {
    this.icon = icon;
}

public Double getLatitude() {
    return latitude;
}

public void setLatitude(Double latitude) {
    this.latitude = latitude;
}

public Double getLongitude() {
    return longitude;
}

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

public String getName() {
    return name;
}

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

public String getVicinity() {
    return vicinity;
}

public void setVicinity(String vicinity) {
    this.vicinity = vicinity;
}

static Place jsonToPontoReferencia(JSONObject pontoReferencia) {
    try {
        Place result = new Place();
        JSONObject geometry = (JSONObject) pontoReferencia.get("geometry");
        JSONObject location = (JSONObject) geometry.get("location");
        result.setLatitude((Double) location.get("lat"));
        result.setLongitude((Double) location.get("lng"));
        result.setIcon(pontoReferencia.getString("icon"));
        result.setName(pontoReferencia.getString("name"));
        result.setVicinity(pontoReferencia.getString("vicinity"));
        result.setId(pontoReferencia.getString("id"));
        return result;
    } catch (JSONException ex) {
        Logger.getLogger(Place.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

@Override
public String toString() {
    return "Place{" + "id=" + id + ", icon=" + icon + ", name=" + name + ", latitude=" + latitude + ", longitude=" + longitude + '}';
}

}

PlaceService Class

public class PlacesService {

private String API_KEY;

public PlacesService(String apikey) {
    this.API_KEY = apikey;
}

public void setApiKey(String apikey) {
    this.API_KEY = apikey;
}

public ArrayList<Place> findPlaces(double latitude, double longitude,
        String placeSpacification) {

    String urlString = makeUrl(latitude, longitude, placeSpacification);

    try {
        String json = getJSON(urlString);

        System.out.println(json);
        JSONObject object = new JSONObject(json);
        JSONArray array = object.getJSONArray("results");

        ArrayList<Place> arrayList = new ArrayList<Place>();
        for (int i = 0; i < array.length(); i++) {
            try {
                Place place = Place
                        .jsonToPontoReferencia((JSONObject) array.get(i));
                Log.v("Places Services ", "" + place);
                arrayList.add(place);
            } catch (Exception e) {
            }
        }
        return arrayList;
    } catch (JSONException ex) {
        Logger.getLogger(PlacesService.class.getName()).log(Level.SEVERE,
                null, ex);
    }
    return null;
}

// https://maps.googleapis.com/maps/api/place/search/json?location=28.632808,77.218276&radius=500&types=atm&sensor=false&key=apikey
private String makeUrl(double latitude, double longitude, String place) {
    StringBuilder urlString = new StringBuilder(
            "https://maps.googleapis.com/maps/api/place/search/json?");

    if (place.equals("")) {
        urlString.append("&location=");
        urlString.append(Double.toString(latitude));
        urlString.append(",");
        urlString.append(Double.toString(longitude));
        urlString.append("&radius=1000");
        // urlString.append("&types="+place);
        urlString.append("&sensor=false&key=" + API_KEY);
    } else {
        urlString.append("&location=");
        urlString.append(Double.toString(latitude));
        urlString.append(",");
        urlString.append(Double.toString(longitude));
        urlString.append("&radius=1000");
        urlString.append("&types=" + place);
        urlString.append("&sensor=false&key=" + API_KEY);
    }
    return urlString.toString();
}

protected String getJSON(String url) {
    return getUrlContents(url);
}

private String getUrlContents(String theUrl) {
    StringBuilder content = new StringBuilder();

    try {
        URL url = new URL(theUrl);
        URLConnection urlConnection = url.openConnection();
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(urlConnection.getInputStream()), 8);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            content.append(line + "\n");
        }
        bufferedReader.close();
    }catch (Exception e) {
        e.printStackTrace();
    }
    return content.toString();
}
}

3 个答案:

答案 0 :(得分:3)

为此你有两个选择

1.在AsynchTask的Listenr中写入Button的OnPostExecute,并将数据传递给Another Activity或..

2.将您的结果变量视为全局并在getCallback()中编写一个方法或类似于您的活动中的方法,并通过在构造函数中使用您的Activity对象在onPostExecute中调用此方法方法写Button点击功能..

如果您在doinBackground()时在外面写按钮,则表示您没有数据,因此会将null传递给另一个Activity

将这样的地方类设计为parcelable ..

public class Place implements Parcelable {
private String id;
private String icon;
private String name;
private String vicinity;
private Double latitude;
private Double longitude;

public Place() {
    // TODO Auto-generated constructor stub
}

public Place(Parcel in) {
    setId(in.readString());
    setIcon(in.readString());
    setName(in.readString());
    setVicinity(in.readString());
    setLatitude(in.readDouble());
    setLongitude(in.readDouble());
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(getId());
    dest.writeString(getIcon());
    dest.writeString(getName());
    dest.writeString(getVicinity());
    dest.writeDouble(getLatitude());
    dest.writeDouble(getLongitude());
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getIcon() {
    return icon;
}

public void setIcon(String icon) {
    this.icon = icon;
}

public Double getLatitude() {
    return latitude;
}

public void setLatitude(Double latitude) {
    this.latitude = latitude;
}

public Double getLongitude() {
    return longitude;
}

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

public String getName() {
    return name;
}

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

public String getVicinity() {
    return vicinity;
}

public void setVicinity(String vicinity) {
    this.vicinity = vicinity;
}

static Place jsonToPontoReferencia(JSONObject pontoReferencia) {
    try {
        Place result = new Place();
        JSONObject geometry = (JSONObject) pontoReferencia.get("geometry");
        JSONObject location = (JSONObject) geometry.get("location");
        result.setLatitude((Double) location.get("lat"));
        result.setLongitude((Double) location.get("lng"));
        result.setIcon(pontoReferencia.getString("icon"));
        result.setName(pontoReferencia.getString("name"));
        result.setVicinity(pontoReferencia.getString("vicinity"));
        result.setId(pontoReferencia.getString("id"));
        return result;
    } catch (JSONException ex) {
        Logger.getLogger(Place.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

@Override
public String toString() {
    return "Place{" + "id=" + id + ", icon=" + icon + ", name=" + name
            + ", latitude=" + latitude + ", longitude=" + longitude + '}';
}

public static final Parcelable.Creator<Place> CREATOR = new Parcelable.Creator<Place>() {

    @Override
    public Place createFromParcel(Parcel in) {
        return new Place(in);
    }

    @Override
    public Place[] newArray(int size) {
        return new Place[size];
    }

};
}

答案 1 :(得分:0)

为什么不为全班定义findPlaces全局

public class MainActivity extends Fragment{
ArrayList<Place> findPlaces;
private GoogleMap mMap;
private String[] places = {"ATM|Hospital|Police|Restaurant"};
public LocationManager locationManager;
public Location loc;
Place placeDetail;

    Button camera_btn = (Button) v.findViewById(R.id.map_activity_cam_button);

    camera_btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            Intent i = new Intent(getActivity(),Compass.class);
               // pass arraylist by clicking on this button. I want resulted arraylist from doInBackground.. i.e. *findplaces*
            startActivity(i);

        }
    });
    return v;

}   

doInBackground()方法

 @Override
protected ArrayList<Place> doInBackground(Void... arg0) {
    PlacesService service = new PlacesService(
            "AIzaSyAmllugM0BoCNosipmHpw1picM2a1XNOEA");
  findPlaces = service.findPlaces(loc.getLatitude(), // 28.632808
            loc.getLongitude(), places); // 77.218276

    for (int i = 0; i < findPlaces.size(); i++) {

        placeDetail = findPlaces.get(i);
        Log.e(TAG, "places : " + placeDetail.getName());
    }
    return findPlaces;
}

}

答案 2 :(得分:0)

如果您的议程是找到地点然后转到下一个活动,那么为什么不在用户点击按钮时启动提取位置,并在所需数据可用后通过post excute导航到下一个活动。

    camera_btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
        new GetPlaces(getActivity(), places[0].toLowerCase().replace("-", "_")).execute();
        }
    });

    private class GetPlaces extends AsyncTask<Void, Void, ArrayList<Place>> {
        @Override
    protected void onPostExecute(ArrayList<Place> result) {

       // Your code for data processing, once its complete then start new activity
       Intent i = new Intent(getActivity(),Compass.class);
       startActivity(i);


     }
   }

希望这有帮助。