【发布时间】:2013-02-03 14:10:35
【问题描述】:
我有一个应用程序,当您加载它时,它会显示 6 个按钮。第 6 个按钮需要可视化一些数据。此数据以JSON 格式存储在我的/raw 文件夹中的txt 文件中。数据大小为 600kb,但目前解析并存储在数据库中大约需要 3 分钟。这个想法是,一旦它在数据库中,读取和使用数据的效率和速度要快得多,而不是每次都直接从文件中读取。
我最初制作应用程序是为了从我的 REST 服务器下载数据,然后将其存储在数据库中,但后来发现将文件与应用程序一起发送会快得多。但是,它仍然很慢。
我正在寻找有关如何加快此文件解析并改善用户体验的建议。目前,他们第一次进入此部分时,会出现ProgressDialog,他们必须等待几分钟(在我的 HTC Desire 上为 3 分钟)才能完成所有这些文件解析,然后才能使用该功能。进度对话框就在那里,一直工作直到完成,用户无法做任何其他事情。它不理想!
我曾考虑在应用程序启动时在后台的单独线程中运行文件处理,没有进度条,所以它对用户来说似乎是无声的,但是,如果他们选择按钮进入该部分应用程序一加载就依赖这些数据,那么它会导致进一步的问题,因为文件处理可能还没有完成。
也许我可以添加一些带有大量文本的“指导性”弹出框,这样当他们阅读它们时,文件处理就完成了。但是,我不确定为应用程序增加了什么价值。使用起来非常简单!
任何人都可以在这里就更好的策略给我建议吗?另外,我是否认为 3 分钟解析 600kb 的 JSON 有点太长了?也许我的逻辑没有它应有的效率。
这里是线程的开始:
private boolean parseFile() {
dialog = ProgressDialog.show(activity,
"Progress Title",
"Progress body",
true);
ReadDataThread unt = new ReadDataThread();
unt.start();
return true;
}
private class ReadDataThread extends Thread {
@Override
public void run() {
InputStream is = activity.getResources().openRawResource(R.raw.dbdata);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
try {
StringBuilder sb = new StringBuilder();
sb.append(reader.readLine());
sortAndStore(sb.toString());
} catch (IOException e) {
Log.e(Constants.TAG, "Error reading data");
e.printStackTrace();
}
handler.sendEmptyMessage(0);
}
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (dialog.isShowing())
dialog.dismiss();
Toast.makeText(activity, "Finished reading data", Toast.LENGTH_SHORT).show();
}
};
}
你会注意到它调用了一个名为sortAndStore的方法,它在这里:
@Override
public boolean sortAndStore(String raw) {
boolean returnCode=false;
ContentValues initialValues = new ContentValues();
try {
JSONObject f = new JSONObject(raw);
JSONArray jsonArr = f.getJSONArray("stops");
int arrSize=jsonArr.length();
for(int i=0; i<arrSize; i++) {
initialValues.put("name", jsonArr.getJSONObject(i).getString("name"));
initialValues.put("lat", jsonArr.getJSONObject(i).getString("lat"));
initialValues.put("lng", jsonArr.getJSONObject(i).getString("lng"));
initialValues.put("StopNumber", jsonArr.getJSONObject(i).getString("StopNumber"));
initialValues.put("Route", jsonArr.getJSONObject(i).getString("Route"));
initialValues.put("Type", jsonArr.getJSONObject(i).getString("Type"));
//Add data to DB
DBHelper db = new DBHelper(activity);
returnCode = db.addData(initialValues, DBHelper.DBTableName);
}
} catch (JSONException e) {
returnCode=false;
e.printStackTrace();
}
return returnCode;
}
我还使用名为 DBHelper 的 DatabaseHelper 类来处理数据库内容。 DBHelper.addData() 方法在这里:
public boolean addData(ContentValues initialValues, String tableName) {
openDatabase();
long returnCode = db.insert(tableName, "ID", initialValues);
closeDatabase();
return (returnCode == -1 ? false:true);
}
那么,任何人都可以根据上述数据提出更好的策略吗?是更高效的文件 I/O 代码,还是一些 UI 技巧让用户觉得处理时间比实际时间短?
谢谢。
【问题讨论】:
-
如何将数据预加载到数据库中并随您的应用一起发布?
-
我同意@Rajesh 使用固定数据,这也是我认为的最佳方式。
-
嗨拉杰什。我不知道你可以用你的应用程序发送一个填充的数据库,因此我为什么要这样做。如果这是真的,那么这显然是最好的选择。我会进一步研究,看看是否可行。
标签: java android database performance