Java 改进从GoogleMapAPI解析JSON的响应方法';行不通

Java 改进从GoogleMapAPI解析JSON的响应方法';行不通,java,android,json,retrofit,google-maps-android-api-2,Java,Android,Json,Retrofit,Google Maps Android Api 2,RegulationResponse方法中的循环不包含它本来应该执行的循环。假设它从谷歌地图url获取json数据 package com.webstarts.byteglory.shomadhan; import android.*; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import a

RegulationResponse方法中的循环不包含它本来应该执行的循环。假设它从谷歌地图url获取json数据

package com.webstarts.byteglory.shomadhan;

import android.*;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.location.Location;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
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.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.webstarts.byteglory.shomadhan.POJO.Example;

import retrofit.Call;
import retrofit.Callback;
import retrofit.GsonConverterFactory;
import retrofit.Response;
import retrofit.Retrofit;

public class StartActivity extends FragmentActivity implements ConnectionCallbacks, OnConnectionFailedListener, com.google.android.gms.location.LocationListener, OnMapReadyCallback {

    protected GoogleApiClient mGoogleApiClient;
    protected Location mLastLocation;
    protected static final String TAG = "Location Services Test";
    private Button search_location_button;
    private Button search_area_button;
    private Button toilet_status_button;
    protected LatLng latlng;
    protected LocationRequest mLocationRequest;

    private GoogleMap mMap;
    private int PROXIMITY_RADIUS = 10000;
    Marker mCurrLocationMarker;
    boolean mapReady = false;
    private Marker mPerth;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
        search_location_button = (Button) findViewById(R.id.search_location_button);
        search_area_button = (Button) findViewById(R.id.search_area_button);
        toilet_status_button = (Button) findViewById(R.id.toilet_status_button);
        locationApiClient();

//        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
//                .findFragmentById(R.id.map);
//        mapFragment.getMapAsync(this);
        search_location_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                Log.i(TAG, String.valueOf(latlng.latitude));
//                Uri gmmIntentUri = Uri.parse("geo:"+String.valueOf(latlng.latitude)+","+String.valueOf(latlng.longitude)+"?z=15&q=public toilets");
//                Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
//                mapIntent.setPackage("com.google.android.apps.maps");
//                startActivity(mapIntent);

                retrofitResponse();

//                Marker loc = mMap.addMarker(new MarkerOptions().position(latlng)
//                        .title("You are here now 23"));
//                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng, 15));
//
//                // Zoom in, animating the camera.
//                mMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
//                Log.i(TAG, String.valueOf(latlng.latitude));


            }
        });

        MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }

    protected synchronized void locationApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    @Override
    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

    /**
     * Runs when a GoogleApiClient object successfully connects.
     */
    @Override
    public void onConnected(Bundle connectionHint) {
        // Provides a simple way of getting a device's location and is well suited for
        // applications that do not require a fine-grained location and that do not need location
        // updates. Gets the best and most recent location currently available, which may be null
        // in rare cases when a location is not available.

        mLocationRequest = LocationRequest.create();
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        mLocationRequest.setInterval(1000);
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if(mLastLocation != null) {
            latlng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
        }
        else {
            Toast toast = Toast.makeText(this, "Turn on your location service", Toast.LENGTH_LONG);
            toast.show();
            finish();
        }
    }

    public void onLocationChanged(Location location) {

    }
    @Override
    public void onConnectionFailed(ConnectionResult result) {
        // Refer to the javadoc for ConnectionResult to see what error codes might be returned in
        // onConnectionFailed.
        Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode());
    }
    /*
    * Called by Google Play services if the connection to GoogleApiClient drops because of an
    * error.
    */
    public void onDisconnected() {
        Log.i(TAG, "Disconnected");
    }
    @Override
    public void onConnectionSuspended(int cause) {
        // The connection to Google Play services was lost for some reason. We call connect() to
        // attempt to re-establish the connection.
        Log.i(TAG, "Connection suspended");
        mGoogleApiClient.connect();
    }

    private void retrofitResponse() {

        String url = "https://maps.googleapis.com/maps/";

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        RetrofitMaps service = retrofit.create(RetrofitMaps.class);

        Call<Example> call = service.getNearbyPlaces("restaurents", latlng.latitude + "," + latlng.longitude, PROXIMITY_RADIUS);

        call.enqueue(new Callback<Example>() {
            @Override
            public void onResponse(Response<Example> response, Retrofit retrofit) {

                try {
                    mMap.clear();
                    // This loop will go through all the results and add marker on each location.
                    Log.i("ishan", String.valueOf(response.body().getResults().size()));
                    for (int i = 0; i < response.body().getResults().size(); i++) {
                        Double lat = response.body().getResults().get(i).getGeometry().getLocation().getLat();
                        Double lng = response.body().getResults().get(i).getGeometry().getLocation().getLng();
                        String placeName = response.body().getResults().get(i).getName();
                        String vicinity = response.body().getResults().get(i).getVicinity();
                        MarkerOptions markerOptions = new MarkerOptions();
                        LatLng latLng = new LatLng(lat, lng);
                        // Position of Marker on Map
                        markerOptions.position(latLng);
                        // Adding Title to the Marker
                        markerOptions.title(placeName + " : " + vicinity);
                        // Adding Marker to the Camera.
                        Marker m = mMap.addMarker(markerOptions);
                        // Adding colour to the marker
                        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
                        // move map camera
                        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                        mMap.animateCamera(CameraUpdateFactory.zoomTo(11));
                        Log.i("ishan", String.valueOf(i));
                    }
                } catch (Exception e) {
                    Log.d("onResponse", "There is an error");
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Throwable t) {
                Log.d("onFailure", t.toString());
            }
        });

    }

    @Override
    public void onMapReady(GoogleMap map) {
        mapReady=true;
        mMap = map;

//        //Initialize Google Play Services
//        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//            if (ContextCompat.checkSelfPermission(this,
//                    android.Manifest.permission.ACCESS_FINE_LOCATION)
//                    == PackageManager.PERMISSION_GRANTED) {
//            }
//        }





    }
}
package com.webstarts.byteglory.shomadhan;
导入android。*;
导入android.content.Intent;
导入android.content.pm.PackageManager;
导入android.net.Uri;
导入android.os.Build;
导入android.support.v4.app.ActivityCompat;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentActivity;
导入android.support.v4.app.FragmentManager;
导入android.support.v4.content.ContextCompat;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.Menu;
导入android.view.view;
导入android.widget.Button;
导入android.location.location;
导入android.widget.Toast;
导入com.google.android.gms.common.ConnectionResult;
导入com.google.android.gms.common.api.GoogleAppClient;
导入com.google.android.gms.common.api.GoogleAppClient.ConnectionCallbacks;
导入com.google.android.gms.common.api.GoogleAppClient.OnConnectionFailedListener;
导入com.google.android.gms.location.LocationRequest;
导入com.google.android.gms.location.LocationServices;
导入com.google.android.gms.maps.CameraUpdateFactory;
导入com.google.android.gms.maps.GoogleMap;
导入com.google.android.gms.maps.MapFragment;
导入com.google.android.gms.maps.OnMapReadyCallback;
导入com.google.android.gms.maps.SupportMapFragment;
导入com.google.android.gms.maps.model.BitmapDescriptorFactory;
导入com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.Marker;
导入com.google.android.gms.maps.model.MarkerOptions;
导入com.webstarts.byteglory.shomadhan.POJO.Example;
进口改装。电话;
进口改装.回收;
进口改装。GsonConverterFactory;
进口改装.响应;
进口改装。改装;
公共类StartActivity扩展了FragmentActivity实现了ConnectionCallbacks、OnConnectionFailedListener、com.google.android.gms.location.LocationListener、OnMapReadyCallback{
受保护的GoogleapClient MGoogleapClient;
受保护位置;
受保护的静态最终字符串TAG=“位置服务测试”;
专用按钮搜索\位置\按钮;
专用按钮搜索\区域\按钮;
专用按钮厕所\状态\按钮;
保护板条;
受保护的位置请求mLocationRequest;
私有谷歌地图;
私人int近距离_半径=10000;
标记器mCurrLocationMarker;
布尔mapredy=false;
私人马克·姆佩思;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
搜索位置按钮=(按钮)findViewById(R.id.search位置按钮);
搜索区域按钮=(按钮)findViewById(R.id.search\u area\u button);
马桶状态按钮=(按钮)findViewById(R.id.马桶状态按钮);
locationApiClient();
//SupportMapFragment mapFragment=(SupportMapFragment)getSupportFragmentManager()
//.findFragmentById(R.id.map);
//getMapAsync(这个);
搜索位置按钮。setOnClickListener(新视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
//Log.i(标签、字符串、值(纬度));
//Uri gmmIntentUri=Uri.parse(“地理:“+String.valueOf(latlng.latitude)+”,“+String.valueOf(latlng.longitude)+”?z=15&q=公共厕所”);
//Intent mapIntent=新的Intent(Intent.ACTION\u视图,gmminentUri);
//setPackage(“com.google.android.apps.maps”);
//星触觉(mapIntent);
响应();
//标记位置=mMap.addMarker(新标记选项().position(latlng)
//.title(“你现在在这里23”);
//mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng,15));
//
////放大,设置相机动画。
//mMap.animateCamera(CameraUpdateFactory.zoomTo(10),2000,空);
//Log.i(标签、字符串、值(纬度));
}
});
MapFragment MapFragment=(MapFragment)getFragmentManager().findFragmentById(R.id.map);
getMapAsync(这个);
}
受保护的同步无效位置ApicClient(){
mgoogleapclient=新的Googleapclient.Builder(此)
.addConnectionCallbacks(此)
.addOnConnectionFailedListener(此)
.addApi(LocationServices.API)
.build();
}
@凌驾
受保护的void onStart(){
super.onStart();
mGoogleApiClient.connect();
}
@凌驾
受保护的void onStop(){
super.onStop();
if(mgoogleapClient.isConnected()){
mGoogleApiClient.disconnect();
}
}
/**
*当GoogleAppClient对象成功连接时运行。
*/
@凌驾
未连接的公共无效(捆绑连接提示){
//提供获取设备位置的简单方法,非常适合
//不需要细粒度位置且不需要位置的应用程序
//更新。获取当前可用的最佳和最新位置,该位置可能为空
//在极少数情况下,位置不可用。
mLocationRequest=LocationRequest.create();
mLocationRequest.setPriority(位置请求.优先级高精度);
mlLocationRequest.setInterval(1000);
if(ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(this,android.Manifest.permission.ACCESS\u LOCATION)!=PackageManager.permission\u已授予){
考虑到呼叫
package com.webstarts.byteglory.shomadhan;

import com.webstarts.byteglory.shomadhan.POJO.Example;

import retrofit.Call;
import retrofit.http.GET;
import retrofit.http.Query;



    public interface RetrofitMaps {

        /*
         * Retrofit get annotation with our URL
         * And our method that will return us details of student.
         */
        @GET("api/place/nearbysearch/json?sensor=true&key=AIzaSyABCGHHSFDGSDsdfGADFnM")
        Call<Example> getNearbyPlaces(@Query("type") String type, @Query("location") String location, @Query("radius") int radius);

    }
            /* implement the toast */
            /* =new ArrayList<User>(); */
           ArrayList<User> test;
            test=response.body().getUsers();
            String jax= test.get(0).getFarm_name();
           //Toast.makeText(MarkerDemoActivity.this, "farm name is "+jax, Toast.LENGTH_LONG).show();
            //LatLng m_cord,String farm_name,String desc
            int i = 0;
            while ( test.size()>i) {
                String farm_name = test.get(i).getFarm_name();
                String desc1 = test.get(i).getOwner_tel();
                String desc2 = test.get(i).getFarm_type();
                String cords = test.get(i).getM_cord();
                //split the co-ords
                String[] latlong = cords.split(",");
                double latitude = Double.parseDouble(latlong[0]);
                double longitude = Double.parseDouble(latlong[1]);
                LatLng location = new LatLng(latitude, longitude);
                //do the loop here
                // Add lots of markers to the map.  LatLng m_cord,String farm_name,String desc
                addMarkersToMapJax(location, farm_name, desc1 + desc2);
                i++;
            }
        }
private void addMarkersToMapJax(LatLng m_cord,String farm_name,String desc) {
        // Uses a colored icon.
        mArc = mMap.addMarker(new MarkerOptions()
                .position(m_cord)
                .title(farm_name)
                .snippet(desc)