2016-06-08 204 views
3

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

+0

您需要将状态或数据本身存储在数据库中,并通过这样做来恢复活动 –

+0

时进行检查,我是否可以将此先前提取的数据适配到第二个列表视图中? –

+0

你需要再次填充数据到列表视图,时间将取决于你的数据的大小 –

回答

-1

你可以简单地使用一个http客户端缓存像OkHttp。在某些情况下更复杂但更合适的是管理内部Sqlite Database

作为一面说明您可以保存所有数据并在重新加载活动时加载它,但不应该。不管你选择什么方式,IO都会参与进来,如果你的数据足够大,它将会是一个沉重的操作。

它是一个很好的实践,可以正确加载活动在加载时需要显示的内容,而不是完整的数据。您应该使用CursorLoader或CursorAdapter来动态加载用户与其交互时所需的活动...

+0

当然我用sqlite数据库来存储本地,我的问题是每次活动启动它从数据库加载数据??数据库是脱机还是联机?我的问题是我可以将数据存储在我的应用会话中? –

+0

可以请你解释一下如何在Facebook应用程序中轻松处理帖子? –

+0

@RoshanSharma这是一个完全不同的问题 –

2

您可以将服务器响应缓存为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; 
} 
+0

从JSON解析和填充到SharedPreferences可能是非常繁重的操作。强烈建议不要这样做。 –

+0

@OfekRon:完全同意你的意见,更新了我的答案。 –

3

有几种可能的方法,您的问题取决于你想要做什么。首先,在您下载和处理数据的活动中,您应该覆盖方法onSaveInstanceStateonRestoreInstanceState,以便您的数据可以持久保存并保持方向更改(而不会松散您处理数据的工作)。

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

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