当我启动我的Android应用程序时,它会在mainactivity中从服务器加载大量数据并使用listView进行调整,当单击listview时,将启动新活动。当从当前活动返回mainactivity时,我的应用程序再次从先前加载的服务器加载数据?如何在下次返回同一活动后使用第一次加载的数据?
答案 0 :(得分:2)
根据您的目的,您可以采用多种方法解决问题。首先,在您下载和处理数据的活动中,您应该覆盖onSaveInstanceState
和onRestoreInstanceState
方法,以便您的数据保持不变并在方向更改后继续存在(并且不会丢失您处理的工作)数据)。
如果您的应用程序只是从主活动打开详细活动,那么当您按下时,您的数据将可用。你不必重新加载任何东西。如果不是这种情况,那么在活动的生命周期中加载数据的方式可能会有一些问题(例如,避免在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动态加载您的活动在用户与之交互时所需的活动......