【问题标题】:Android - General advice needed on parsing a file on first runAndroid - 首次运行时解析文件所需的一般建议
【发布时间】: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


【解决方案1】:

我认为您在角落某处的某个固定区域(如操作栏或其他东西)显示进度。进度可能会在您的应用中全局显示进度。然后用户会知道正在进行的工作,您可以让用户在没有您的数据的情况下完成一些操作。

【讨论】:

    【解决方案2】:

    如前所述,您可以使用预填充的数据库发布应用。查看这篇文章,它非常简单明了Using your own SQLite database in Android applications

    【讨论】:

      【解决方案3】:

      我通过简单地使用 statements 而不是单独的 insert 语句来解决此问题。

      例如,在for()循环之前,我得到了数据库并启动了事务。然后我像往常一样经历了循环。循环之后,我简单地关闭了事务,从而启用了批量事务。

      现在插入只需几秒钟!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        • 1970-01-01
        相关资源
        最近更新 更多