java - 从mysql数据库获取 map 标记到android应用程序

标签 java android mysql json google-maps

我对 android 编程和 java 编程完全陌生。我有一个现有的网络应用程序,它的坐标存储在 mysql 数据库中。通过遵循有关 Google Map API 和 JSON 的一些在线教程,我编写了代码以显示存储在数据库中的点的 map 标记。

我的 php 脚本在运行时返回以下输出

[{"RowID":"15","LatLng":"(27.70171145916157, 85.30419380111698)","Type":"hospital"},{"RowID":"16","LatLng": "(27.704200193429045, 85.32494337005619)","类型":"医院"}]

我创建了一个类来解析 JSON 数据

    public class ImportMarkers {

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

    // constructor
    public ImportMarkers() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            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;

    }
}

最后为了在我创建的 map View 中显示标记,我使用了以下代码

    //url to make request
private static String url = "http://10.0.2.2/jsonsenddata.php";

//JSON Node names
private static final String id = "RowID";
private static final String latlng = "LatLng";
private static final String type = "Type";

JSONArray markers = null;

     // Creating JSON Parser instance
        ImportMarkers marker = new ImportMarkers();

        // getting JSON string from URL
        JSONObject json = marker.getJSONFromUrl(url);

        try {
            // Getting AJSONObjectrray 
            markers = json.getJSONArray(null);

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

                // Storing each json item in variable
                String RowID = c.getString(id);
                String LatLng = c.getString(latlng);
                String Type = c.getString(type);
                String[] parts = LatLng.split(",");
                String lat = parts[0]; 
                String lon = parts[1]; 
                float latInt = Float.valueOf(lat).floatValue(); 
                float longInt = Float.valueOf(lon).floatValue(); 
                GeoPoint X = new GeoPoint((int) (latInt*1E6),(int) (longInt*1E6) ); 
                if (Type == "hospital"){
                    OverlayItem overlayItem = new OverlayItem (X , "Hospital", "ADDITION");
                    AddLocation hospital = new AddLocation (hos, MainActivity.this);
                    hospital.addLocation(overlayItem);
                    overlayList.add(hospital);
                }
                else {
                    OverlayItem overlayItem = new OverlayItem (X , "Airport", "ADDITION");
                    AddLocation airport = new AddLocation (air, MainActivity.this);
                    airport.addLocation(overlayItem);
                    overlayList.add(airport);
                }


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

我不知道我的代码有什么问题,如果有人能提供一些帮助,我将不胜感激。

这是我的logcat日志

12-02 13:45:41.348: D/dalvikvm(448): GC_CONCURRENT freed 174K, 4% free 6623K/6855K, paused 6ms+4ms
12-02 13:45:41.628: D/dalvikvm(448): GC_CONCURRENT freed 356K, 6% free 6823K/7239K, paused 4ms+4ms
12-02 13:45:42.028: D/dalvikvm(448): GC_CONCURRENT freed 699K, 11% free 6616K/7431K, paused 4ms+5ms
12-02 13:45:42.028: W/CursorWrapperInner(448): Cursor finalized without prior close()
12-02 13:45:42.038: W/CursorWrapperInner(448): Cursor finalized without prior close()
12-02 13:45:42.438: D/dalvikvm(448): GC_CONCURRENT freed 198K, 7% free 6929K/7431K, paused 4ms+7ms
12-02 13:45:42.789: D/dalvikvm(448): GC_CONCURRENT freed 311K, 5% free 7189K/7559K, paused 8ms+16ms
12-02 13:45:43.258: D/dalvikvm(448): GC_CONCURRENT freed 519K, 8% free 7234K/7815K, paused 5ms+7ms
12-02 13:45:43.580: D/dalvikvm(448): GC_CONCURRENT freed 267K, 6% free 7385K/7815K, paused 5ms+4ms
12-02 13:45:44.048: D/dalvikvm(448): GC_CONCURRENT freed 675K, 10% free 7259K/8007K, paused 5ms+4ms
12-02 13:45:44.148: D/AndroidRuntime(448): Shutting down VM
12-02 13:45:44.148: W/dalvikvm(448): threadid=1: thread exiting with uncaught exception (group=0x40014760)
12-02 13:45:44.168: E/AndroidRuntime(448): FATAL EXCEPTION: main
12-02 13:45:44.168: E/AndroidRuntime(448): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.finalyear.quakereact/com.finalyear.quakereact.MainActivity}: android.os.NetworkOnMainThreadException
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.app.ActivityThread.access$500(ActivityThread.java:122)
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.os.Looper.loop(Looper.java:132)
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.app.ActivityThread.main(ActivityThread.java:4123)
12-02 13:45:44.168: E/AndroidRuntime(448):  at java.lang.reflect.Method.invokeNative(Native Method)
12-02 13:45:44.168: E/AndroidRuntime(448):  at java.lang.reflect.Method.invoke(Method.java:491)
12-02 13:45:44.168: E/AndroidRuntime(448):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
12-02 13:45:44.168: E/AndroidRuntime(448):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
12-02 13:45:44.168: E/AndroidRuntime(448):  at dalvik.system.NativeStart.main(Native Method)
12-02 13:45:44.168: E/AndroidRuntime(448): Caused by: android.os.NetworkOnMainThreadException
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
12-02 13:45:44.168: E/AndroidRuntime(448):  at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:368)
12-02 13:45:44.168: E/AndroidRuntime(448):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208)
12-02 13:45:44.168: E/AndroidRuntime(448):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431)
12-02 13:45:44.168: E/AndroidRuntime(448):  at java.net.Socket.connect(Socket.java:901)
12-02 13:45:44.168: E/AndroidRuntime(448):  at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
12-02 13:45:44.168: E/AndroidRuntime(448):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143)
12-02 13:45:44.168: E/AndroidRuntime(448):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
12-02 13:45:44.168: E/AndroidRuntime(448):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
12-02 13:45:44.168: E/AndroidRuntime(448):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
12-02 13:45:44.168: E/AndroidRuntime(448):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
12-02 13:45:44.168: E/AndroidRuntime(448):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
12-02 13:45:44.168: E/AndroidRuntime(448):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
12-02 13:45:44.168: E/AndroidRuntime(448):  at com.finalyear.quakereact.ImportMarkers.getJSONFromUrl(ImportMarkers.java:38)
12-02 13:45:44.168: E/AndroidRuntime(448):  at com.finalyear.quakereact.MainActivity.onCreate(MainActivity.java:80)
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.app.Activity.performCreate(Activity.java:4397)
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
12-02 13:45:44.168: E/AndroidRuntime(448):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
12-02 13:45:44.168: E/AndroidRuntime(448):  ... 11 more
12-02 13:46:42.368: I/Process(448): Sending signal. PID: 448 SIG: 9

提前谢谢你。

最佳答案

异常(exception)是NetworkOnMainThreadException

The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged.

因此,在单独的线程上获取。 AsyncTask 也许? (如果你需要更新 UI)

关于java - 从mysql数据库获取 map 标记到android应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669263/

相关文章:

java - 是否可以使用字符串内容作为绘画的图像修饰符?

java - 打开文件会产生 java.lang.NullPointerException

php - Android:如何使用php在mysql中上传图像

mysql - 从另一张表插入,如果键存在则更新,可以在一个查询中吗?

java - Elasticsearch Java API : query string validation

java - 使用 Guice 的 @Inject 注入(inject) @Context 字段(到子资源中)

php - 如何将查询的多个结果插入另一个表?

mysql - 在 OSticket 中获取所有门票

java - 如何在我的 Nexus 5 设备上使用其他语音识别服务?

android - 如何在 Android 的 sdcard 中设置代理自动配置 (PAC) 文件