案例:为了让我的应用程序的用户即使无法访问互联网也能使用该应用程序,我将数据存储在 SQLite 数据库中。为了让 App 的不同部分获取当前用户数据,我使用了 Singleton。 像这样;
在使用前获取数据并存储: 请求服务器 => 数据打包 => 单例 => SQLite 数据库。
为用户显示数据: SQLite DB => Java 类 => 单例 => Activity
调用以将数据存储到 SQLite 数据库:
DatabaseConductor dbc = new DatabaseConductor(getApplicationContext());
dbc.setReturnCue(MyActivity.this);
dbc.execute(DataBaseActions.STUFF_SQL_IN);
DatabaseConductor 的基本功能是:
public class DataBaseConductor extends AsyncTask<String, String, String> {
private Context context;
private DataBaseConductorCueing returnCue = null;
for (String message : params) {
Log.d("Doing in BG", message);
switch (message) {
case THING_TO_DO:
methodToActiallyDoStuff();
break;
}
是的,DatabaseConductor 和调用 Activity 都使用一个接口(interface)来进行通信。像这样:
public interface DataBaseConductorCueing {
void processFinish(String output);
}
现在我使用 public static final Strings 来检查需要做什么,老实说,ENUM 可能会更好。我希望这段代码能清楚地展示它是如何工作的。 是否可以做其他事情来优化它?
编辑 1:整数优于枚举。
编辑 2:接口(interface)的设计模式是回调接口(interface),这样您就不必注册处理程序。
最佳答案
好像是订阅dbc.setReturnCue(MyActivity.this);
如果您不取消订阅,您将遇到内存泄漏问题。
您提到了 Singleton,但是在 DatabaseConductor
的代码 fragment 实例中。
AsyncTasks 在单个后台线程上连续执行(来自 API 11)。所以长时间运行的 worker 可以阻止其他人。
您多久收到一次请求?您可以考虑使用服务。
public static final Strings to check what needs to be done
您只有一个 Activity 客户端吗?
你们是怎么解决数据同步的?
如果您真的很在意优化,请不要使用 enum .
关于Android Activity & Async SQLite 通信优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37465053/