保存事件类型日志
Posted
技术标签:
【中文标题】保存事件类型日志【英文标题】:Save event type logs 【发布时间】:2018-05-11 18:07:43 【问题描述】:我们希望在现有应用程序中添加报告功能。
为此,我们通过HTTPS
将JSON
中的事件发送到服务器应用程序。
我们需要记住无法发送到服务器的事件对象(没有互联网,服务器无法访问......)。我们正在考虑将事件存储在 SQLite
数据库中,并丢弃所有超过 24 小时的事件,以防止存储空间泛滥。
另一种选择是将 JSON 对象写入文件,并在无法发送到服务器时连接每个新事件。这个解决方案的问题是,我们很难丢弃超过 24 小时的日志。
我们将事件存储在一个带有列的表中:
|编号 | json | created_at |
谁能推荐这个用例的最佳实践?
目前我们倾向于使用sqlite
解决方案,但我们想知道是否有任何我们不知道的警告。
【问题讨论】:
【参考方案1】:如果您不介意使用第三方库,我可以推荐 android-priority-jobqueue。您可以轻松实现您想要做的事情。您始终可以创建工作,它会自行处理。你可以设置它是否需要网络,如果它是持久的(没有网络时保存到数据库中),甚至你可以自定义你自己的重试逻辑。
这是一个小例子。
public class PostTweetJob extends Job
public static final int PRIORITY = 1;
private String text;
public PostTweetJob(String text)
// This job requires network connectivity,
// and should be persisted in case the application exits before job is completed.
super(new Params(PRIORITY).requireNetwork().persist());
@Override
public void onAdded()
// Job has been saved to disk.
// This is a good place to dispatch a UI event to indicate the job will eventually run.
@Override
public void onRun() throws Throwable
// yours code here
@Override
protected RetryConstraint shouldReRunOnThrowable(Throwable throwable, int runCount,
int maxRunCount)
// An error occurred in onRun.
return RetryConstraint.createExponentialBackoff(runCount, 1000);
你这样称呼它。
jobManager.addJobInBackground(new PostTweetJob("It works"));
【讨论】:
这能很好地处理许多工作吗?我们的应用每天可以产生多达一万个事件。 我想是的。它在内部使用 SQLite,所以我认为它会很好。【参考方案2】:在此解决方案中使用 JobService(Android 5+ - lollipop 及更高版本)和 AlarmManager(适用于 android sdk
附: 在这种情况下,您不需要任何第三方库和其他依赖项,例如 firebase/google play services(例如 FirebaseDispatcher)
【讨论】:
以上是关于保存事件类型日志的主要内容,如果未能解决你的问题,请参考以下文章