【问题标题】:How to restore data in any activity after returning from another activity?从另一个活动返回后如何恢复任何活动中的数据?
【发布时间】:2016-06-08 17:29:32
【问题描述】:

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

【问题讨论】:

  • 您需要将状态或数据本身存储在数据库中,并在活动恢复时进行检查
  • 通过这样做,我可以在一秒钟内将之前获取的数据调整到列表视图吗?
  • 您需要再次将数据填充到列表视图中,时间取决于您的数据大小

标签: android android-activity


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

    • 解析 JSON 和从 JSON 中进行解析并将其填充到 SharedPreferences 可能是非常繁重的操作。我强烈建议不要这样做。
    • @OfekRon :完全同意你的看法,更新了我的答案。
    【解决方案3】:

    您可以简单地使用带有缓存的 http 客户端,例如 OkHttp。更复杂但在某些情况下更合适的是管理内部Sqlite Database

    作为旁注您可以保存所有数据并在重新加载活动时加载它,但您不应该这样做。无论您选择哪种方式,都会涉及IO,如果您的数据足够大,这将是一项繁重的操作。

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

    【讨论】:

    • 确定我使用 sqlite 数据库在本地存储,我的问题是每次活动开始时它都会从数据库加载数据??数据库是离线还是在线?我的问题是我可以将这些数据存储在我的应用会话中吗??
    • 能否请您解释一下如何在 Facebook 应用中轻松处理帖子??
    • @RoshanSharma 这是一个完全不同的问题
    • 不,它是相似的。我想在 facebook 加载时加载帖子?在facebook中返回上一个活动时,使用以前获取的数据☺☺
    • 因为他们只在需要时才加载需要的内容。从内部 sqlite 数据库加载几篇文章可能需要几毫秒或几纳秒。您可以确定他们不会像您想的那样提前加载所有帖子。
    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多