如何在关闭应用程序并显示以前保存的实例时恢复用户以前的数据?

时间:2014-11-03 08:12:20

标签: android google-maps android-activity

我正在使用GoogleMaps,我将标记放在谷歌地图上。通过调用api获得的标记信息。

现在我的问题是,如果用户没有互联网连接或者它已关闭我不希望该应用程序应该崩溃,而是应该向用户显示放置在谷歌地图上的最后一个会话标记。

我已阅读并尝试了一些方法,例如可以使用onPause()或onStart()方法完成。但我没有得到它:

源代码看起来像这样。

public class MapActivity  extends Activity{
    // onCreate
    // making an asynchronous call and storing the latitude and longitude of multiple marker in varibale place
   doInBAckground(){  
      place = apicall.getPlaces();
   }
   onPostExecute(){
     plotmarkers(place);
   }

 private void plotMarkers(List<Place> markers) {
        if (markers.size() > 0) {
            for (Place myMarker : markers) {
                MarkerOptions markerOption = new MarkerOptions().position(new LatLng(myMarker.getLatitude(), myMarker.getLongitude()));
                markerOption.icon(BitmapDescriptorFactory.fromResource(markerImage));

                Marker currentMarker = mMap.addMarker(markerOption);
                mMarkersHashMap.put(currentMarker, myMarker);
            }
        }
    } 
}

现在我想要的是我应该能够向用户显示以前保存的实例。 我没有让这个工作..我已经看到OLA出租车应用程序可以这样做。

请让我知道如何处理它... Thanx提前.. 如果需要更多的片段,请告诉我

3 个答案:

答案 0 :(得分:2)

你可以:

  • 让您的http客户端为您缓存
  • 将数据与活动状态一起保存
  • 将下载的数据保存到硬盘

您选择使用哪一个取决于您想要对缓存进行多少控制。

HTTP客户端缓存 缓存很容易实现。您只需配置HTTP客户端以使用磁盘缓存。使用看起来像这样的OkHTTP:

private static final int DISK_CACHE_SIZE = 2 << 20; // 2MB cache

OkHttpClient createOkHttpClient(Application app) {
    OkHttpClient client = new OkHttpClient();

    // Install an HTTP cache in the application cache directory.
    try {
        File cacheDir = new File(app.getCacheDir(), "http");
        Cache cache = new Cache(cacheDir, DISK_CACHE_SIZE);
        client.setCache(cache);
    } catch (IOException e) {
        LOG.e("<tag>", "Unable to install disk cache.", e);
    }
    return client;
}

以活动状态保存 我不推荐这种方法。它仅适用于您的在线数据变化如此之快以至于持续很长时间对用户没有帮助。在这种情况下,您将使用活动状态保存它,因为它只持续很短的时间。阅读有关实施此here的信息。

坚持使用硬盘 这是我的首选解决方案。您可以以任何您喜欢的方式保存数据,并在以后再次加载。您可以使用共享首选项,或使用SQLite。如果您选择使用SQLite,您应该寻找可以使您更容易实现的库。我知道CupboardOrmLite非常好。

答案 1 :(得分:0)

您可以覆盖onSaveInstanceState()方法。

这是您保存数据的方式:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // save marker data
    savedInstanceState.putString("coordinates", mMarker.getCoordinates());

    // always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}
  

注意:稍后,我建议在其中实现Parcelable接口   您的模型(例如Place,Marker,MarkerOptions),这样您就可以轻松完成   将你的整个对象放在Bundle中。比它更方便   处理单个类成员并为每个成员创建一个单独的密钥   他们。

这就是你在onCreate()方法中检索它的方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // restore value from saved state
        String coordinates = savedInstanceState.getString("coordinates");
        // do something with the restored data
    } else {
        // download from API
        // do something with the downloaded data
    }
    ...
}

有关详细信息,请查看the official documentation

答案 2 :(得分:0)

虽然其他答案提供了保存标记的好方法,但您还应记住Google Maps terms of use中列出的规则:

  

内容”指通过本服务提供的任何内容(无论是否   由Google或其第三方许可人创建),包括地图和   地形数据,摄影图像,交通数据,地点数据   (包括商家信息)或任何其他内容。

     

除了您之外,您不得预先获取,缓存或存储任何内容   可以存储:(i)用于改进的有限数量的内容   如果您这样做,您的Maps API实施的性能   暂时(并且没有事件超过30个日历日),   安全地,并且以不允许使用内容的方式   服务之外;