Android SQLite vs File vs JSON?

时间:2015-01-10 10:51:31

标签: java android json sqlite

我正在使用谷歌地图在地图上绘制标记。我可以保存所有这些点的数据(超过17000行,包含3列:shopId,shopName,lat,long)。

我还可以发送JSON查询,指定我的lat / long以及我想要数据的商店周围的半径。然后我会收到数据。这是有效的,但是当我创建标记(使用AsyncTask)时,应用程序中会发生冻结(并且很明显)。

这是我用来在Google地图上生成自定义标记的代码:

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            try {
                JSONArray jsonArray = new JSONArray(result);
                String finalReturn[] = result.split("\\r?\\n");
                if(jsonArray.get(0).toString().equals("4")) {

                    for (int i = 1; i < finalReturn.length; i++) {
                        jsonArray = new JSONArray(finalReturn[i]);
                       IconGenerator iconGenerator = new IconGenerator(getApplicationContext());
                       iconGenerator.setStyle(IconGenerator.STYLE_RED);
                        iconGenerator.setRotation(90);
                        iconGenerator.setContentRotation(-90);
                        Bitmap iconBitmap = iconGenerator.makeIcon(jsonArray.get(5).toString());

                        Marker marker = mMap.addMarker(new MarkerOptions()
                                .position(new LatLng(jsonArray.getDouble(6), jsonArray.getDouble(7)))
                                .icon(BitmapDescriptorFactory.fromBitmap(iconBitmap)));
                        marker.setTitle(jsonArray.getString(1));
                        marker.setSnippet(jsonArray.getString(2) + " " + jsonArray.getString(8));
                    }
                }
            } catch (JSONException e) {

            }

我的问题是,这里最好的解决方案是什么,将点存储在MySQL服务器中并从该区域生成最近的商店(SQlite Getting nearest locations (with latitude and longitude)这样的东西),或者总是向服务器查询数据。或者可能是两者的混合(查询服务器,然后将数据保存在SQLite数据库中。)

我只是Android的初学者,很抱歉,如果这个问题很简单。

1 个答案:

答案 0 :(得分:0)

最快的方法应该是将数据保存在SQLite数据库中并从那里进行查询,但如果您只需要靠近用户的几家商店,那么每次只需调用Web服务就可以了。 / p>

除此之外,您的应用中发生的冻结很可能是由于在UI-Thread中调用了 onPostExecute 方法,并且您在此方法中做了大量工作。

你不应该在那里解析你的JSON,而是在 doInBackground 方法中,并且对于调用 onProgressUpdate 方法的每个已解析元素调用 publishProgress (也在UI-Thread中执行。

像这样,您可以一次处理在地图上设置一个标记,这样,系统可以使用单个 onProgressUpdate 调用之间的时间来更新UI,这样不再发生冻结。

它应该看起来像这样:

 protected Void doInBackground(...) {
     String result = getResult();
     try {
            JSONArray jsonArray = new JSONArray(result);
            String finalReturn[] = result.split("\\r?\\n");
            if(jsonArray.get(0).toString().equals("4")) {

                for (int i = 1; i < finalReturn.length; i++) {
                    jsonArray = new JSONArray(finalReturn[i]);
                    publishProgress(jsonArray);
                }
            }
     } catch (JSONException e) {
          //handle error
        }
 }

 @Override
 protected void onProgressUpdate(JSONArray... progress) {
     JSONArray array = progress[0];
     IconGenerator iconGenerator = new IconGenerator(getApplicationContext());
     iconGenerator.setStyle(IconGenerator.STYLE_RED);
     iconGenerator.setRotation(90);
     iconGenerator.setContentRotation(-90);
     Bitmap iconBitmap = iconGenerator.makeIcon(jsonArray.get(5).toString());

     Marker marker = mMap.addMarker(new MarkerOptions()
                      .position(new LatLng(jsonArray.getDouble(6), jsonArray.getDouble(7)))
                      .icon(BitmapDescriptorFactory.fromBitmap(iconBitmap)));
     marker.setTitle(jsonArray.getString(1));
     marker.setSnippet(jsonArray.getString(2) + " " + jsonArray.getString(8));
 }