Android - 保持webservice结果在内存中

时间:2016-10-23 07:48:19

标签: android rest memory

在我的Android应用程序中,我必须从其余的Web服务查询一些用户/会话相关数据。现在我需要一种方法将收到的Web服务结果保存在内存中,以便多个活动/片段可以访问它们。 我不希望将数据(例如用户银行帐户的列表)保存到设备上的数据库中,因为数据会在一段时间后或用户注销时过期。 当用户导航到另一个活动时,我也不想从webservice一次又一次地请求数据。

在应用程序运行期间,是否有任何已批准的模式可以在内存中保留一组数据(某些具有更多或更少属性的pojo)?

仅供参考:我正在尝试使用dagger2,mvp,retrofit2,rxandroid

此致 马丁

3 个答案:

答案 0 :(得分:0)

这是一个解决方案: 1-创建一个DefaultUtil类:

DefaultUtil.getInstance().getUserList();

2-完成Web服务后,请调用以下代码:

function readFile(file)
{
    var f = new XMLHttpRequest();
    f.open("GET", file, false);
    f.onreadystatechange = function ()
    {
        if(f.readyState === 4)
        {
            if(f.status === 200 || f.status == 0)
            {
                var res= f.responseText;
                alert(res);
            }
        }
    }
    f.send(null);
}

然后您可以通过以下方式访问任何类的用户列表:

File:\\

答案 1 :(得分:0)

如果您已经在尝试使用Dagger 2,那么您需要做的就是在Application中实例化一个组件,并在ActivitiesFragments中使用此组件以便注入一个范围"服务"

例如:

  • 创建一个名为XyzManager的类(其中Xyz =此经理负责的实际功能)
  • 使用@Provides范围
  • 注释其@Singleton方法(在Dagger'模块中)
  • 确保在XyzManager中实例化注入Application的组件并将getComponent()方法添加到自定义Appliaction
  • 使用相同的组件ActivitiesFragments注入XyzManager((MyApplication)getApplication()).getComponent().inject(this)

    如果您采取上述步骤,那么您的所有ActivitiesFragments都将获得与XyzManager完全相同的实例的引用,并且您在此管理器中缓存的数据将是无处不在。

    您将获得的结构与this answer中描述的结构非常相似。

请注意,这种方法比解决static事情要好得多(例如Singleton模式,或@KhalidTaha在答案中建议的内容)。

如果您需要有关框架方面的详细信息,您可能需要查看有关Dagger 2范围的at my post

答案 2 :(得分:0)

@Vasiliy 我已经研究了相关的答案,但我没有得到它。我不直接在活动中使用我的BankingSession单例,因此调用“getComponent()。inject(this)....”将不起作用。我在其他服务类中使用单例(不是Android服务......只是业务逻辑)。

// this should be a single instance across the whole app
@Singleton
public class BankingSession { 

    @Inject
    public BankingSession() {
    }
}


public class SessionServiceImpl implements SessionService {

    private final BankingSession bankingSession;

    @Inject
    public SessionServiceImpl(BankingSession bankingSession) {
        this.bankingSession = bankingSession;
    }
}


@Module
public class SessionModule {

    @Provides
    public SessionService provideSessionService(SessionServiceImpl sessionService) {
        return sessionService;
    }
}


@Singleton
@Component(modules = {AppModule.class, NetworkModule.class,    SessionModule.class})
public interface AppComponent {
    Application application();
    LoginComponent plus(LoginModule module);
    AccountComponent plus(AccountModule module);
    BankingSession bankingSession();
}

无论我如何尝试,BankingSession的构造函数都被多次调用