【问题标题】:Markers not displayed in the google map using JSON使用 JSON 的谷歌地图中未显示的标记
【发布时间】:2014-08-15 11:31:37
【问题描述】:

我正在尝试从 JSON Parsing 添加标记。但标记未显示在地图中。谁能帮帮我吗?这是我的代码:

MainActivity.java

package com.hasibhasan.sampletask;

import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONObject;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends ActionBarActivity {
    private GoogleMap googlemap;
    private static String TAG_POSTS = "posts";
    private static String TAG_DRIVER = "driver";
    private static String TAG_ID = "id";
    private static String TAG_LATITUDE = "lat";
    private static String TAG_LONGITUDE = "lon";
    private static String TAG_DATETIME = "recorded_datetime";
    private static String TAG_USERID = "user_id";
    private static String TAG_STATE = "cabby_state";
    private static String TAG_VTYPE = "vehicleType";
    private static String TAG_DRIVERNAME = "driver_name";
    private static String TAG_PICNAME = "pic_name";
    private static String TAG_RATING = "rating";
    private static String TAG_CARMODEL = "car_model";
    private static String TAG_NUMBERSIT = "number_sit";
    private static String TAG_DISTANCE = "distance";
    private static String TAG_OPERATOR = "operator";
    private static String TAG_NEARESTDISTANCE = "nearest_distance";
    private static String TAG_NDISTANCE = "distance";
    private static String TAG_TIME = "time";
    private static String TAG_CARMODELS = "car_models";
    ArrayList<Taxi> taxi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        taxi = new ArrayList<Taxi>();
        new ParseJSONTask().execute();
        googlemap = ((MapFragment) getFragmentManager().findFragmentById(
                R.id.map)).getMap();
    }

    private class ParseJSONTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {

            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
            WebServiceHandler webServiceHandler = new WebServiceHandler();
            String jsonstr = webServiceHandler
                    .getJSONData("http://54.186.247.213/unicabi/mobileservice/CurrentLocationService.php");
            try {
                JSONObject jsonObject = new JSONObject(jsonstr);
                JSONArray postJson = jsonObject.getJSONArray(TAG_POSTS);
                for (int i = 0; i < postJson.length(); i++) {
                    Taxi aTaxi = new Taxi();
                    JSONObject postObject = postJson.getJSONObject(i);
                    aTaxi.lat = postObject.getString(TAG_LATITUDE);
                    aTaxi.lon = postObject.getString(TAG_LONGITUDE);
                    aTaxi.driver_name = postObject.getString(TAG_DRIVERNAME);
                    taxi.add(aTaxi);
                    double lati = Double.parseDouble(aTaxi.lat);
                    double lon = Double.parseDouble(aTaxi.lon);
                    googlemap.addMarker(new MarkerOptions().title(
                            aTaxi.driver_name).position(new LatLng(lati, lon)));

                }

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

        @Override
        protected void onPostExecute(Void result) {

            super.onPostExecute(result);
        }
    }
}

出租车。 java(模型类)

package com.hasibhasan.sampletask;

public class Taxi {
    public String posts = "";
    public String success = "";
    public String driver = "";
    public String id = "";
    public String lat = "";
    public String lon = "";
    public String recorded_datetime = "";
    public String vehicleType = "";
    public String driver_name = "";
    public String pic_name = "";
    public String rating = "";
    public String car_model = "";
    public String number_sit = "";
    public String distance = "";
    public String operator = "";
    public String nearest_distance = "";
    public String car_models = "";

}

Webservicehandler.java

    package com.hasibhasan.sampletask;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class WebServiceHandler {
    public WebServiceHandler() {

    }

    public String getJSONData(String url) {
        String response = null;
        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        HttpEntity httpEntity = null;
        HttpResponse httpResponse = null;
        try {
            httpResponse = httpclient.execute(httpGet);
            httpEntity = httpResponse.getEntity();
            response = EntityUtils.toString(httpEntity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return response;

    }

}

【问题讨论】:

  • 您无法从 doInBackground 更新 ui。所以添加标记必须在ui线程上
  • 明白。但是我如何获得 Lat,Lng 呢?由于纬度和经度停留在 DoInBackground 中,因此无法从主线程访问它们。请帮我先生。

标签: java android json google-maps


【解决方案1】:

array of MarkerOptions 传递给在UI 线程上运行的onPostExecute 方法。您可以在那里将标记添加到您的地图中。示例:

private class ParseJSONTask extends AsyncTask<Void, Void, List<MarkerOptions>> {
    @Override
    protected void onPreExecute() {

        super.onPreExecute();
    }

    @Override
    protected List<MarkerOptions> doInBackground(Void... params) {
        WebServiceHandler webServiceHandler = new WebServiceHandler();
        String jsonstr = webServiceHandler
                .getJSONData("http://54.186.247.213/unicabi/mobileservice/CurrentLocationService.php");
        try {
            JSONObject jsonObject = new JSONObject(jsonstr);
            JSONArray postJson = jsonObject.getJSONArray(TAG_POSTS);
            List<MarkerOptions> markers = new ArrayList<MarkerOptions>();
            for (int i = 0; i < postJson.length(); i++) {
                Taxi aTaxi = new Taxi();
                JSONObject postObject = postJson.getJSONObject(i);
                aTaxi.lat = postObject.getString(TAG_LATITUDE);
                aTaxi.lon = postObject.getString(TAG_LONGITUDE);
                aTaxi.driver_name = postObject.getString(TAG_DRIVERNAME);
                taxi.add(aTaxi);
                double lati = Double.parseDouble(aTaxi.lat);
                double lon = Double.parseDouble(aTaxi.lon);
                markers.add(new MarkerOptions().title(aTaxi.driver_name).
                        position(new LatLng(lati, lon)));

                return markers;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return new ArrayList<MarkerOptions>();
    }

    @Override
    protected void onPostExecute(List<MarkerOptions> markers) {
        super.onPostExecute(markers);
        for (MarkerOptions marker : markers) {
            googlemap.addMarker(marker);
        }
    }
}

【讨论】:

  • 谢谢。但是在“protected void onPostExecute(List markers) {: 这一行有一个错误说“MainActivity.ParseJSONTask 类型的方法 onPostExcute(List) 必须覆盖或实现一个超级方法”。我该怎么办那个?
  • “受保护的 List doInBackground(Void...params) {”中有一个错误,这行也说“它与 AsyncTask, Void> 不兼容”。
  • 我已根据您的建议进行了修改,但它在 doinbackground 和 onpostexecute 中显示了一些错误。请帮忙。
  • @confused 是我的代码中的一个错误。我在AsyncTask 的声明中更改了错误的返回类型。现已更新。
  • 非常感谢。最后一个问题,如果提供的 url 没有任何相关数据要解析或被破坏,那么应用程序将如何运行?我的意思是应用程序会崩溃还是只会显示地图但不显示标记?
【解决方案2】:

您正在尝试从非 UI 线程更新 UI。这是不允许的,通常应该抛出异常。您最好使用自定义侦听器将出租车列表从您的 onPostExecute 方法传递到您的 UI 线程。 制作自定义监听器:

public interface ParsingFinishedListener{
    public abstract void onParsingFinished(List<MarkerOptions> markers;
}

像这样向你的 asyncTask 添加一个构造函数:

public ParseJsonTask(ParsingFinishedListener l){
    this.mParsingFinisedListener = l;
}

并在 onPostExecute 返回列表:

@Override
protected void onPostExecute(List<MarkerOptions> markers) {
    super.onPostExecute(markers);
    mParsingFinishedListener.onParsingFinished(markers);
}

并重写你的 onCreate 方法:

@Override
public void onCreate(Bundele savedInstance){
    super.onCreate(savedInstance);
    setContentView(R.layout.activity_main);
    googlemap = ((MapFragment) getFragmentManager().findFragmentById(
    R.id.map)).getMap();
    taxi = new ArrayList<Taxi>();
    new ParseJSONTask().execute(new ParsingFinishedListener(){
        @Override
        public void onParsingFinished(List<MarkerOptions> m){
            for (MarkerOptions marker : markers) {
                googlemap.addMarker(marker);
            }
        }
    );

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 2015-03-21
    • 2020-06-08
    • 2013-07-05
    • 1970-01-01
    • 2013-05-18
    • 2011-10-18
    相关资源
    最近更新 更多