ロードすると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トリックのいずれかですか?
ありがとうございました。