Android Studio无法使用json绘制标记

时间:2016-09-06 08:19:43

标签: android json google-maps google-maps-api-3

我正在尝试使用json绘制标记,其中没有显示标记。这是我的地图活动代码。

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback  {
    public GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }


    public void onMapSearch (View view) throws IOException {

        //hide button when button is pressed
        InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

        //preview the entered address as an Tost in bar
        EditText locationSearch = (EditText) findViewById(R.id.editText);
        String location = locationSearch.getText().toString();

        //this will animate camera and zoom 12.0f
        mMap.animateCamera(CameraUpdateFactory.zoomTo(12.0f));



        //further address search codes
        List<Address> addressList = null;

        //if nothing will be entered in the edit-text will not show a toast rather than crashing of thekha app
        if (locationSearch.getText().toString().equals("")){
            Toast.makeText(this,"Bitch please enter A Value",Toast.LENGTH_LONG).show();
        }
        else {

            //process of exception handling and finding location
            if (location != null || !location.equals("")) {
                Geocoder geocoder = new Geocoder(this);
                try {
                    addressList = geocoder.getFromLocationName(location, 1);
                } catch (IOException e) {
                    e.printStackTrace();
                  }
                //if address is greater than one then these processes will happen

                if(addressList.size()>0) {
                    Address address = addressList.get(0);
                    LatLng latLng = new LatLng(address.getLatitude(), address.getLongitude());
                    mMap.addMarker(new MarkerOptions()
                            .position(latLng)
                            .title(location + " is Here- ")
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
                    mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));

                    Toast.makeText(this, location+" is here, Zoom In or Zoom Out to make your Thekha Visible ", Toast.LENGTH_LONG)
                            .show(); //popup type to show entered data
                }
                else {
                    //process where entered entry will not gonna find , this will gonna a toast to show popup

                    Toast.makeText(this,"Entered Address Not Found", Toast.LENGTH_LONG).show();

                }
            }

        }
    }



    private void setUpMap (){
        final MapsActivity that = this;
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    retriveAndAddMarker();
                }catch (IOException e){
                    Toast.makeText(that,"Can not fetch data",Toast.LENGTH_LONG).show();
                }

            }
        });
    }

    protected void retriveAndAddMarker () throws IOException {
        final MapsActivity that = this;

        HttpURLConnection conn = null;
        final StringBuilder json = new StringBuilder();
        try {
            //connect to the web service
            URL url = new URL("http://www.loofre.com/api-for-webservice/?debug=true&action=getLocations");
            conn = (HttpURLConnection) url.openConnection();
            InputStreamReader in = new InputStreamReader(conn.getInputStream());
            //This will read the json data into string builder
            int read;
            char[] buff = new char[1024];
            while ((read = in.read(buff)) != -1) {
                json.append(buff, 0, read);
            }
        } catch (IOException e) {
            Toast.makeText(this, "Error connecting to Service", Toast.LENGTH_LONG).show();
            throw new IOException("Error Connecting to service ", e);

        } finally {
            if (conn != null)

                conn.disconnect();
            Toast.makeText(this,"Disconnected",Toast.LENGTH_LONG).show();
        }


        //create marker for the onMapReady over main thekha app
        // Must run this on this on the UI thread since its the UI operation.

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                try {

                    Toast.makeText(that, "Connection SuccessFull", Toast.LENGTH_LONG).show();
                    createMarkerFromJson(json.toString());
                }catch (JSONException e){
                    Toast.makeText(that,"",Toast.LENGTH_LONG).show();
                }
            }
        });

    }

    void createMarkerFromJson (String json) throws JSONException {
        // de-derialize the json string into an array of objects


            JSONArray jsonArray = new JSONArray(json);
            for (int i =0; i<jsonArray.length(); i++){
                //create marker of each place in the json data
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                mMap.addMarker(new MarkerOptions()
                             .title(jsonObject.getString("name"))
                                .snippet(Integer.toString((jsonObject.getInt("address"))))
                               .position(new LatLng(
                                       jsonObject.getJSONArray("latlang").getDouble(0),
                                       jsonObject.getJSONArray("latlang").getDouble(0)

                                       )
                               )
                );

            }

        }

    //OnReady map starts here when we can enter or add Marker to the map
    @Override
    public void onMapReady(GoogleMap googleMap) {
       mMap = googleMap;

        setUpMap();
        // no 1 marker
        LatLng dwarka = new LatLng(28.570317,77.32182);
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(dwarka, 13));
        mMap.addMarker(new MarkerOptions()
                       .title("Wine Beer Liquor Shop, Sector 18, Noida")
                        .snippet("Sector 18, Near Centre Stage Mall, Noida")
                           .position( dwarka ));
        //no 2 marker
        LatLng OPG_world_School = new LatLng(28.581074,77.314349);
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(OPG_world_School,13));
        mMap.addMarker(new MarkerOptions()
                        .title("Wine Beer Liquor Shop, Sector 15, Noida")
                           .snippet("Basoya Complex, Sector 15, Near Wipro, Noida")
                              .position(OPG_world_School));
        //no 3 marker
        LatLng sector27 = new LatLng(28.581074,77.314349);
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sector27,13));
        mMap.addMarker(new MarkerOptions()
                .title("Wine Beer Liquor Shop, sector 27, Noida")
                .snippet("Dharam Pali Palace, Sector 27, Near Vinayak Hospital, Noida")
                .position(sector27));
        //no 4 marker
        LatLng gurgramamb = new LatLng(28.504865,77.094588); // tobe edited
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(gurgramamb,13));
        mMap.addMarker(new MarkerOptions()
                      .title("Discovery Wines")
                       .snippet("Discovery Wines, Ambience Mall, Gurgaon")
                        .position(gurgramamb));

        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;
        }
        //tool bar and other tool related on map uiSettings
        mMap.setMyLocationEnabled(true);
        mMap.getUiSettings().setZoomControlsEnabled(true);
        mMap.getUiSettings().setMapToolbarEnabled(true);
        mMap.getUiSettings().setMyLocationButtonEnabled(true);

    }
}

1 个答案:

答案 0 :(得分:0)

您的问题出在retriveAndAddMarker。您正在使用应该使用AsyncTask运行的网络线程进行呼叫。

  

网络运营可能涉及不可预测的延迟。为防止此操作导致糟糕的用户体验,请始终在UI的单独线程上执行网络操作。 AsyncTask类提供了从UI线程启动新任务的最简单方法之一 - Android Developers [Perform Network Operations on a Separate Thread]

您可以尝试添加此代码段:

private class RetrieveMarkerTask extends AsyncTask<StringBuilder, Void, StringBuilder> {

    private Context context;

    public RetrieveMarkerTask(Context context){
        this.context = context;
    }

    @Override
    protected StringBuilder doInBackground(StringBuilder... stringBuilders) {
        HttpURLConnection conn = null;
        final StringBuilder json = new StringBuilder();
        try {
            //connect to the web service
            URL url = new URL("http://www.loofre.com/api-for-webservice/?debug=true&action=getLocations");
            conn = (HttpURLConnection) url.openConnection();
            InputStreamReader in = new InputStreamReader(conn.getInputStream());
            //This will read the json data into string builder
            int read;
            char[] buff = new char[1024];
            while ((read = in.read(buff)) != -1) {
                json.append(buff, 0, read);
            }
        } catch (IOException e) {
            return null;
        } finally {
            if (conn != null)
                conn.disconnect();

        }
        return json;
    }

    @Override
    protected void onPostExecute(StringBuilder stringBuilder) {
        super.onPostExecute(stringBuilder);

        if(null != stringBuilder){
            try {
                ((MapsActivity)context).createMarkerFromJson(stringBuilder.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

retriveAndAddMarker()中,删除此方法中的所有行,并替换为下面的行。

protected void retriveAndAddMarker (){
    //remove all the previous code
    new RetrieveMarkerTask(this).execute();
}

注意: 我只是根据你的代码创建了AsyncTask,所以我不确定它是否正常工作。您需要自己调试它。