Android Google Maps v2 添加来自 JSON 数组的地图标记 php mySQL

Android Google Maps v2 add Map markers from JSON array php mySQL

我正在尝试创建一个 Android 应用程序来从我的 mySQL 数据库中在 Google Maps v2 上绘制标记,但它不起作用。

Mapactivity.java

    public class MapsActivity extends FragmentActivity  {
    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();
    // url to get all products list
    private static String url_all_products = "http://127.0.0.1/get_marker.php";
    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_Coordinates = "products";
    private static final String TAG_PID = "pid";
    private static final String TAG_X = "x_coordinate";
    private static final String TAG_Y = "y_coordinate";
    // products JSONArray
    JSONArray products = null;
    private GoogleMap mMap; // Might be null if Google Play services APK is not available.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        setUpMapIfNeeded();
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }
    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.

            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {



                // Add marker info window click listener
              //  mMap.setOnInfoWindowClickListener(this);
                //Zooming Buttons
                UiSettings mapSettings;
                mapSettings = mMap.getUiSettings();
                mapSettings.setZoomControlsEnabled(true);
                //Zooming Buttons


                GetMarker();
            }
        }
    }
    private void GetMarker()
    {
        mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        mMap.setMyLocationEnabled(true);
        double xi = 49.999065;
        double yi = 8.273978;

        LatLng MUSEUM = new LatLng(xi , yi);
        Marker museum = mMap.addMarker(new MarkerOptions()
                .position(MUSEUM)
                .title("Mainzer Dom")
                .snippet("Der Mainzer Dom"));


        new Thread(new Runnable() {
            public void run() {
                retrieveAndAddCities();
            }
        }).start();

    }

    private void retrieveAndAddCities()  {

        List params = new ArrayList();
        // getting JSON string from URL
        JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);

        // Check your log cat for JSON reponse
        Log.d("All Products: ", json.toString());

        try {
            // Checking for SUCCESS TAG
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {
                // products found
                // Getting Array of Products
                products = json.getJSONArray(TAG_Coordinates);

                // looping through All Products
                for (int i = 0; i < products.length(); i++) {
                    JSONObject c = products.getJSONObject(i);

                    // Storing each json item in variable
                    int id = c.getInt(TAG_PID);
                    double x_coordinate = c.getDouble(TAG_X);
                    double y_coordinate = c.getDouble(TAG_Y);
                    mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(x_coordinate,y_coordinate )));
                }

            } else {


            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

}

还有我的 php 代码: get_marker.php

    <?php

/*
 * Following code will list all the products
 */


$response = array();


require_once __DIR__ . '/db_connect.php';


$db = new DB_CONNECT();


$result = mysql_query("SELECT *FROM products") or die(mysql_error());


if (mysql_num_rows($result) > 0) {

    $response["products"] = array();

    while ($row = mysql_fetch_array($result)) {

        $product = array();
        $product["pid"] = $row["pid"];
        $product["x_coordinate"] = $row["x_coordinate"];
        $product["y_coordinate"] = $row["y_coordinate"];
        $product["created_at"] = $row["created_at"];
        $product["updated_at"] = $row["updated_at"];


        array_push($response["products"], $product);
    }

    $response["success"] = 1;

    // echoing JSON response
    echo json_encode($response);
} else {

    $response["success"] = 0;
    $response["message"] = "No products found";


    echo json_encode($response);
}
?>

这是 JsonParser

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
                                      List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

如果我尝试启动 retrieveAndAddCities();

new Thread(new Runnable() {
            public void run() {
                retrieveAndAddCities();
            }
        }).start();

我的应用程序会崩溃。

我希望有人能帮助我。非常感谢

编辑: Logcat:

04-06 01:50:04.268    5153-5168/flo.myapplication D/OpenGLRenderer﹕ Render dirty regions requested: true
04-06 01:50:04.271    5153-5153/flo.myapplication D/﹕ HostConnection::get() New Host Connection established 0xae0d8560, tid 5153
04-06 01:50:04.304    5153-5153/flo.myapplication D/Atlas﹕ Validating map...
04-06 01:50:04.364    5153-5168/flo.myapplication D/﹕ HostConnection::get() New Host Connection established 0xae0d8ae0, tid 5168
04-06 01:50:04.373    5153-5168/flo.myapplication I/OpenGLRenderer﹕ Initialized EGL, version 1.4
04-06 01:50:04.446    5153-5168/flo.myapplication D/OpenGLRenderer﹕ Enabling debug mode 0
04-06 01:50:04.465    5153-5168/flo.myapplication W/EGL_emulation﹕ eglSurfaceAttrib not implemented
04-06 01:50:04.465    5153-5168/flo.myapplication W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa605e2c0, error=EGL_SUCCESS
04-06 01:50:11.068    5153-5153/flo.myapplication I/zzx﹕ Making Creator dynamically
04-06 01:50:11.071    5153-5153/flo.myapplication W/ResourcesManager﹕ Asset path '/system/framework/com.android.media.remotedisplay.jar' does not exist or contains no resources.
04-06 01:50:11.071    5153-5153/flo.myapplication W/ResourcesManager﹕ Asset path '/system/framework/com.android.location.provider.jar' does not exist or contains no resources.
04-06 01:50:11.088    5153-5153/flo.myapplication I/Google Maps Android API﹕ Google Play services client version: 7095000
04-06 01:50:11.092    5153-5153/flo.myapplication I/Google Maps Android API﹕ Google Play services package version: 7097470
04-06 01:50:11.205    5153-5165/flo.myapplication I/art﹕ Background partial concurrent mark sweep GC freed 11075(592KB) AllocSpace objects, 0(0B) LOS objects, 38% free, 6MB/10MB, paused 5.446ms total 25.641ms
04-06 01:50:11.363    5153-5165/flo.myapplication I/art﹕ Background sticky concurrent mark sweep GC freed 49928(2039KB) AllocSpace objects, 3(561KB) LOS objects, 0% free, 11MB/11MB, paused 2.593ms total 119.732ms
04-06 01:50:11.423    5153-5165/flo.myapplication I/art﹕ Background partial concurrent mark sweep GC freed 12702(547KB) AllocSpace objects, 2(1015KB) LOS objects, 28% free, 10MB/14MB, paused 5.173ms total 52.148ms
04-06 01:50:11.551    5153-5153/flo.myapplication I/Choreographer﹕ Skipped 31 frames!  The application may be doing too much work on its main thread.
04-06 01:50:11.608    5153-5168/flo.myapplication W/EGL_emulation﹕ eglSurfaceAttrib not implemented
04-06 01:50:11.608    5153-5168/flo.myapplication W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa602e720, error=EGL_SUCCESS
04-06 01:50:11.648    5153-5185/flo.myapplication D/﹕ HostConnection::get() New Host Connection established 0xa5491d90, tid 5185
04-06 01:50:11.657    5153-5186/flo.myapplication D/All Products:﹕ {"products":[{"pid":"1","x_coordinate":"50","y_coordinate":"8","created_at":"2015-04-06 01:13:22","updated_at":"0000-00-00 00:00:00"}],"success":1}
04-06 01:50:11.657    5153-5186/flo.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-378
    Process: flo.myapplication, PID: 5153
    java.lang.IllegalStateException: Not on the main thread
            at com.google.l.a.cd.b(Unknown Source)
            at com.google.maps.api.android.lib6.c.ca.a(Unknown Source)
            at com.google.maps.api.android.lib6.c.el.a(Unknown Source)
            at com.google.android.gms.maps.internal.l.onTransact(SourceFile:167)
            at android.os.Binder.transact(Binder.java:380)
            at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addMarker(Unknown Source)
            at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
            at flo.myapplication.MapsActivity.retrieveAndAddCities(MapsActivity.java:201)
            at flo.myapplication.MapsActivity.access[=19=]0(MapsActivity.java:98)
            at flo.myapplication.MapsActivity.run(MapsActivity.java:168)
            at java.lang.Thread.run(Thread.java:818)

好的,我现在用AsyncTask修改了代码,但我也报错

package flo.myapplication;

import android.os.StrictMode;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
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 android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.View;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.google.android.gms.maps.UiSettings;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener;
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 org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
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 org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Dialog;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MapsActivity extends FragmentActivity  {
    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();
    // url to get all products list
    private static String url_all_products = "http://88.198.46.8/get_marker.php";
    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_Coordinates = "products";
    private static final String TAG_PID = "pid";
    private static final String TAG_X = "x_coordinate";
    private static final String TAG_Y = "y_coordinate";
    // products JSONArray
    JSONArray products = null;
    private GoogleMap mMap; // Might be null if Google Play services APK is not available.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        setUpMapIfNeeded();
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }
    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.

            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {



                // Add marker info window click listener
              //  mMap.setOnInfoWindowClickListener(this);
                //Zooming Buttons
                UiSettings mapSettings;
                mapSettings = mMap.getUiSettings();
                mapSettings.setZoomControlsEnabled(true);
                //Zooming Buttons


                GetMarker();
            }
        }
    }
    private void GetMarker()
    {
        mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        mMap.setMyLocationEnabled(true);
        double xi = 49.999065;
        double yi = 8.273978;

        LatLng MUSEUM = new LatLng(xi , yi);
        Marker museum = mMap.addMarker(new MarkerOptions()
                .position(MUSEUM)
                .title("Mainzer Dom")
                .snippet("Der Mainzer Dom"));


        // Loading products in Background Thread
        new retrieveAndAddCities().execute();





    }

    class retrieveAndAddCities extends AsyncTask<String, String, String> {
        protected String doInBackground(String... args) {
            List params = new ArrayList();
            // getting JSON string from URL
            JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);

            // Check your log cat for JSON reponse
            Log.d("All Products: ", json.toString());

            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // products found
                    // Getting Array of Products
                    products = json.getJSONArray(TAG_Coordinates);

                    // looping through All Products
                    for (int i = 0; i < products.length(); i++) {
                        JSONObject c = products.getJSONObject(i);

                        // Storing each json item in variable
                        int id = c.getInt(TAG_PID);
                        double x_coordinate = c.getDouble(TAG_X);
                        double y_coordinate = c.getDouble(TAG_Y);
                        mMap.addMarker(new MarkerOptions()
                                .position(new LatLng(x_coordinate,y_coordinate )));
                    }

                } else {


                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

    }



}

和Logcat文件:

04-06 02:29:30.055    5324-5339/flo.myapplication D/OpenGLRenderer﹕ Render dirty regions requested: true
04-06 02:29:30.076    5324-5324/flo.myapplication D/﹕ HostConnection::get() New Host Connection established 0xae0d5550, tid 5324
04-06 02:29:30.129    5324-5324/flo.myapplication D/Atlas﹕ Validating map...
04-06 02:29:30.274    5324-5339/flo.myapplication D/﹕ HostConnection::get() New Host Connection established 0xae0d59a0, tid 5339
04-06 02:29:30.397    5324-5339/flo.myapplication I/OpenGLRenderer﹕ Initialized EGL, version 1.4
04-06 02:29:30.574    5324-5339/flo.myapplication D/OpenGLRenderer﹕ Enabling debug mode 0
04-06 02:29:30.693    5324-5339/flo.myapplication W/EGL_emulation﹕ eglSurfaceAttrib not implemented
04-06 02:29:30.693    5324-5339/flo.myapplication W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa604a400, error=EGL_SUCCESS
04-06 02:29:30.788    5324-5324/flo.myapplication I/Choreographer﹕ Skipped 37 frames!  The application may be doing too much work on its main thread.
04-06 02:29:37.319    5324-5324/flo.myapplication I/zzx﹕ Making Creator dynamically
04-06 02:29:37.321    5324-5324/flo.myapplication W/ResourcesManager﹕ Asset path '/system/framework/com.android.media.remotedisplay.jar' does not exist or contains no resources.
04-06 02:29:37.321    5324-5324/flo.myapplication W/ResourcesManager﹕ Asset path '/system/framework/com.android.location.provider.jar' does not exist or contains no resources.
04-06 02:29:37.336    5324-5324/flo.myapplication I/Google Maps Android API﹕ Google Play services client version: 7095000
04-06 02:29:37.361    5324-5324/flo.myapplication I/Google Maps Android API﹕ Google Play services package version: 7097470
04-06 02:29:37.396    5324-5336/flo.myapplication I/art﹕ Background sticky concurrent mark sweep GC freed 0(0B) AllocSpace objects, 0(0B) LOS objects, 1% free, 2MB/2MB, paused 5.461ms total 9.101ms
04-06 02:29:37.582    5324-5336/flo.myapplication I/art﹕ Background partial concurrent mark sweep GC freed 45498(2MB) AllocSpace objects, 11(2MB) LOS objects, 29% free, 9MB/13MB, paused 999us total 105.746ms
04-06 02:29:37.835    5324-5324/flo.myapplication I/Choreographer﹕ Skipped 32 frames!  The application may be doing too much work on its main thread.
04-06 02:29:37.924    5324-5339/flo.myapplication W/EGL_emulation﹕ eglSurfaceAttrib not implemented
04-06 02:29:37.924    5324-5339/flo.myapplication W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa6078180, error=EGL_SUCCESS
04-06 02:29:37.977    5324-5358/flo.myapplication D/All Products:﹕ {"products":[{"pid":"1","x_coordinate":"50","y_coordinate":"8","created_at":"2015-04-06 01:13:22","updated_at":"0000-00-00 00:00:00"}],"success":1}
04-06 02:29:37.978    5324-5358/flo.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: flo.myapplication, PID: 5324
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.IllegalStateException: Not on the main thread
            at com.google.l.a.cd.b(Unknown Source)
            at com.google.maps.api.android.lib6.c.ca.a(Unknown Source)
            at com.google.maps.api.android.lib6.c.el.a(Unknown Source)
            at com.google.android.gms.maps.internal.l.onTransact(SourceFile:167)
            at android.os.Binder.transact(Binder.java:380)
            at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addMarker(Unknown Source)
            at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
            at flo.myapplication.MapsActivity$retrieveAndAddCities.doInBackground(MapsActivity.java:200)
            at flo.myapplication.MapsActivity$retrieveAndAddCities.doInBackground(MapsActivity.java:174)
            at android.os.AsyncTask.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
04-06 02:29:38.024    5324-5357/flo.myapplication D/﹕ HostConnection::get() New Host Connection established 0x9fbe30a0, tid 5357
04-06 02:29:38.833    5324-5336/flo.myapplication I/art﹕ Background partial concurrent mark sweep GC freed 10277(451KB) AllocSpace objects, 32(1505KB) LOS objects, 23% free, 13MB/17MB, paused 795us total 118.120ms

好的,那么你可以像这样使用异步任务,我的代码中可能有一些语法错误,但你可以这样做。

public class myclass extends  Asynctask<Void,Void,Void>{
@Override
 public void doInBackground(){
   retrieveAndAddCities();    }
}

您的应用正在崩溃,因为您正试图从主线程更新 UI。您的 JSON 请求成功,但当您的代码点击 mMap.addMarker() 时应用程序崩溃。

http://developer.android.com/guide/components/processes-and-threads.html

使用 AsyncTask 是个好主意,但您只需要在 doInBackground() 中执行 JSON 请求,因为 doInBackground 不会在主线程上 运行 并且您的应用程序将以同样的方式崩溃目前是。如果您确实使用 AsyncTask,请查看文档。 Google 有一个很好的例子。

http://developer.android.com/reference/android/os/AsyncTask.html

我修改了您的 retrieveAndAddCities class 以使其正常工作。 doInBackground 现在 returns 一个 JSON 产品数组。当 doInBackground 完成时,JSONArray of products 作为参数传递给 onPostExecute。 onPostExecute 运行s 在主线程上。它现在包含 for 循环,您可以在其中循环遍历产品并添加地图标记。

class retrieveAndAddCities extends AsyncTask< Void, Void, JSONArray > {
    protected JSONArray doInBackground(Void... args) {
        List params = new ArrayList();
        // getting JSON string from URL
        JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);

        // Check your log cat for JSON reponse
        Log.d("All Products: ", json.toString());

        try {
            // Checking for SUCCESS TAG
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {
                // products found
                // Getting Array of Products
                return json.getJSONArray(TAG_Coordinates);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(JSONArray products) {
        if (products != null) {
            for (int i = 0; i < products.length(); i++) {
                JSONObject c = null;
                try {
                    c = products.getJSONObject(i);
                    // Storing each json item in variable
                    int id = c.getInt(TAG_PID);
                    double x_coordinate = c.getDouble(TAG_X);
                    double y_coordinate = c.getDouble(TAG_Y);
                    mMap.addMarker(new MarkerOptions()
                            .position(new LatLng(x_coordinate, y_coordinate)));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        } else {
            //Handle case of no products or failure
        }
    }
}