如何从其他活动返回后恢复任何活动中的数据?

时间:2016-06-08 08:53:33

标签: android android-activity

当我启动我的Android应用程序时,它会在mainactivity中从服务器加载大量数据并使用listView进行调整,当单击listview时,将启动新活动。当从当前活动返回mainactivity时,我的应用程序再次从先前加载的服务器加载数据?如何在下次返回同一活动后使用第一次加载的数据?

3 个答案:

答案 0 :(得分:2)

根据您的目的,您可以采用多种方法解决问题。首先,在您下载和处理数据的活动中,您应该覆盖onSaveInstanceStateonRestoreInstanceState方法,以便您的数据保持不变并在方向更改后继续存在(并且不会丢失您处理的工作)数据)。

如果您的应用程序只是从主活动打开详细活动,那么当您按下时,您的数据将可用。你不必重新加载任何东西。如果不是这种情况,那么在活动的生命周期中加载数据的方式可能会有一些问题(例如,避免在onStart/onResume方法中加载和处理数据)。

如果您希望在应用程序死亡后保留数据,您可以使用http缓存(例如使用OkHttp)或使用Sqlite数据库,正如其他人指出的那样。这些方法也可以结合使用,以获得额外的性能提升。

答案 1 :(得分:1)

您可以以JSON和存储的形式缓存共享首选项中的服务器响应,以避免每次都进行服务器调用。 (但是,仅在数据较小时才建议这样做)

示例:

public <T> void putJsonIntoSharedPreferences(String key, T object) {
    SharedPreferences sharedPreferences = getSharedPreferences();
    SharedPreferences.Editor edit = sharedPreferences.edit();
    String json = convertToJson(object);
    edit.putString(key, json);
    edit.commit();
}


public <T> T getFromSharedPreferences(String key, Class<T> clazz) {
   SharedPreferences sharedPreferences = getSharedPreferences();
    final String fromSharedPreferences = sharedPreferences.getString(key, "");
    T object = null;
    if (!fromSharedPreferences.equals("")) {
        try {
            object = JsonConverter.fromJson(fromSharedPreferences, clazz);
        } catch (IOException e) {
            return null;
        }
    } else {
        try {
            return clazz.newInstance();
        } catch (Exception e) {

            return  null;
        }
    }
    return object;
}

private <T> T fromJson(String json, Class<T> clazz) throws IOException {
    ObjectMapper objectMapper = getObjectMapper();
    if(json!=null)
    return objectMapper.readValue(json,clazz);

    return null;
}

 private String convertToJson(Object object) {
    ObjectMapper objectMapper = new ObjectMapper();
    String string = null;
    try {
        string = objectMapper.writeValueAsString(object);
    } catch (JsonProcessingException e) {
        Log.d(ComponentConstants.JSON_PARSE_ERROR_TAG,e.getMessage(),e);
    }
    return string;
}

答案 2 :(得分:0)

您只需使用带有OkHttp等缓存的http客户端即可。在某些情况下,更复杂但更合适的是管理内部Sqlite Database

作为旁注您可以保存所有数据并在重新加载活动时加载它但不应该。因为没有你选择的方式,IO将参与进来,如果你的数据足够大,它将是一个繁重的操作。

良好的做法是准确加载活动在加载时需要显示的内容,而不是完整数据。您应该使用CursorLoader或CursorAdapter动态加载您的活动在用户与之交互时所需的活动......