0

ロードすると6つのボタンが表示されるアプリがあります。6番目のボタンでは、一部のデータを視覚化する必要があります。このデータは、私のフォルダのJSON形式でtxtファイルに保存されます。/rawデータのサイズは600kbですが、現時点では、解析してデータベースに保存するのに約3分かかります。アイデアは、データベースに入ると、毎回ファイルから直接読み取るのではなく、データを読み取って使用するのがはるかに効率的かつ高速になるということです。

私はもともと、RESTサーバーからデータをダウンロードしてデータベースに保存するようにアプリを作成していましたが、アプリと一緒にファイルを送信する方がはるかに高速であると考えました。ただし、それでもかなり遅いです。

このファイルの解析を高速化し、ユーザーエクスペリエンスを向上させる方法についてのアドバイスを探しています。現時点では、このセクションに初めて入るProgressDialogと、が表示され、この機能を使用する前に、このファイルの解析がすべて完了するまで数分(私のHTC Desireでは3分)待つ必要があります。進行状況ダイアログボックスはそこにあり、完了するまで作業を続け、ユーザーは他に何もできません。それは理想的ではありません!アプリの起動時に、プログレスバーなしでバックグラウンドの別のスレッドでファイル処理を実行することを考えていたので、ユーザーには無音に見えますが、ボタンを選択してそのセクションに移動すると、アプリが読み込まれるとすぐにこのデータに依存しますが、ファイル処理が完了していない可能性があるため、さらに問題が発生します。

おそらく、たくさんのテキストを含むいくつかの「説明用」ポップアップボックスを追加して、それらを読むまでにファイル処理が完了するようにすることができます。ただし、アプリにどのような価値があるのか​​わかりません。使い方はとても簡単です!

誰かがここでより良い戦略についてアドバイスをくれますか?また、600kbのJSONを解析するのに3分は少し長すぎると思いますか?おそらく、私のロジックは本来あるべきほど効率的ではありません。

スレッドの開始は次のとおりです。

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;
}

また、データベース関連のものを処理するために呼び出されるDatabaseHelperクラスを使用しDBHelperます。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トリックのいずれかですか?

ありがとうございました。

4

3 に答える 3

0

アクションバーなどの隅にある固定領域で進行状況を表示すると思います。進行状況は、アプリ内でグローバルに進行状況を表示する場合があります。そうすれば、ユーザーは何か作業が行われていることを知ることができ、データなしでユーザーに何らかのアクションを実行させることができます。

于 2013-02-03T14:18:01.677 に答える
0

前に提案したように、事前に入力されたデータベースを使用してアプリを出荷できます。この記事を確認してください。Androidアプリケーションで独自のSQLiteデータベースを使用するのは非常に簡単です。

于 2013-02-03T16:24:15.163 に答える
0

statements個別のinsertステートメントの代わりに使用するだけでこれを修正しました。

たとえば、for()ループの前に、データベースを取得してトランザクションを開始しました。それから私は通常通りループを通過しました。ループの後、トランザクションを閉じるだけで、一括トランザクションが有効になります。

インサートは数秒で完了します!!

于 2013-02-19T15:15:46.370 に答える