0

ユーザーがアプリケーションをロードするたびに提供されるファイルに1000行あります。

私の現在のアプローチは次のとおりです。

MainActivity:onCreate:AsyncTaskを開始します

AsyncTask onPreExecute: 進行状況のダイヤルを表示

AsyncTask doInBackground: キー/値がsharedpreferencesに存在するかどうかを確認します。存在する場合は、doInBackgroundで何もしません。いいえ(初めてのユーザー)の場合は、rawファイルから読み取り、stringbuilderを作成します。StringBuilderのコンテンツをSharedpreferencesのキーと値のペアとして保存します。

AsyncTask onPostExecute: sharedpreferencesからtextviewにデータを入力します。進行状況ダイアログを閉じます。

doInBackgroundメソッドでファイルから読み取るコードは次のとおりです。

StringBuilder sb = new StringBuilder();
InputStream textStream = getBaseContext().getResources().openRawResource(R.raw.file);
BufferedReader bReader = new BufferedReader(new InputStreamReader(textStream));

String aJsonLine = null;
try {
    while ((aJsonLine = bReader.readLine()) != null) {
        sb.append(aJsonLine + System.getProperty("line.separator"));
    }
} catch (IOException e) {
    e.printStackTrace();
} finally{
    try {
        bReader.close();
        textStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

ユーザーは、最初の起動には約9〜10秒、その後の起動には4〜5秒待つ必要があることがわかりました。私の場合、パフォーマンスを改善するための提案。

4

3 に答える 3

1

他のコメントの小さな副産物として、aJsonLineは文字列であるため、1つではなく2つのappend()を使用して、その値を改行と一緒に格納することをお勧めします。

sb.append(aJsonLine);
sb.append(System.getProperty("line.separator"));

それ以外の:

sb.append(aJsonLine + System.getProperty("line.separator"));

後者では、aJsonLineとSystem.getProperty( "line.separator"))の結果の両方をStringBuilderに変換してから、それらの間の連結を実行し、最終値をパラメーターとして渡す必要があります。

もちろん、System.getProperty("line.separator"))alの値もキャッシュする必要があります

于 2013-03-25T07:17:56.930 に答える
1

リスト全体が読み込まれるのをユーザーに待たせる必要はありません。画面いっぱいに表示するのに十分なデータ(10〜20項目、多分?)ができたら、画面上のリストなどに既にあるデータを入力します。これにより、遅延はまったく重要ではなくなります。

http://developer.android.com/reference/android/content/AsyncTaskLoader.htmlをチェックして、どのように実行されるかを確認できます。

于 2013-03-25T07:40:50.903 に答える
0

JsonReaderを介してJSONストリームを読み取り、関心のある名前と値のペアを抽出したいと思います。文字列の連結/ガベージコレクションはコストのかかる操作です。現在のコードの記述方法では、これらの操作によりタスクの速度が低下します。また、ループの反復ごとに行区切り文字にアクセスするなど、コードには非効率性がありますSystem.getProperty("line.separator")

を使用するだけで、パフォーマンスが大幅に向上するはずJSONReaderです。

于 2013-03-25T06:14:59.997 に答える