6

私はAndroidアプリケーションを作成しています。このアプリケーションでは、約1MBの約1000個の要素を含むjson文字列をダウンロードし、これらをそれぞれ解析してSQLiteデータベースに変換します。これを使用してListActivityにデータを入力します。

ダウンロードと解析は、アプリとのすべての対話で実行する必要があるものではありませんが(最初の実行時、またはユーザーがデータの更新を選択した場合のみ)、解析部分に時間がかかりすぎるのではないかと心配しています。 、約2〜3分で-電話アプリの用語では永遠のようです!

現在、Gsonを使用して各jsonオブジェクトを解析し、定義したカスタムオブジェクトに変換してから、SQLiteOpenHelperを使用してデータベースに入力しています。

私の質問は-これを実装するより速い方法はありますか?Gsonを使用せずに、jsonと直接対話する方が著しく高速でしょうか?それとも私は物事を遅くしている以下のコードで愚かなことをしていますか?

jsonをSQLiteに解析するためにAsyncTaskで使用しているメソッドは次のとおりです。

protected Boolean doInBackground(Integer... bType) {

    InputStream source = getJsonInputStream(bTypeString);

    VegDataHandler db = new VegDataHandler(mainActivity, bTypeString);
    Gson gson = new Gson();
    Reader reader = new InputStreamReader(source);

    JsonParser jParser = new JsonParser();
    JsonArray jArray = jParser.parse(reader).getAsJsonArray();

    aLength = jArray.size();
    mCurrProgress = 1;
    publishProgress(mCurrProgress, 0, aLength);

    /* Each array element is of the form { company: {...} } */
    int i = 0;
    mCurrProgress = 2;
    for (JsonElement obj : jArray) {
        Company c = gson.fromJson(obj.getAsJsonObject().getAsJsonObject("company"), Company.class);
        db.addCompany(c);
        i++;
        publishProgress(mCurrProgress, i);
    }
}

これは、SQLiteOpenHelperを拡張するVegDataHandlerクラスのaddCompanyメソッドです。

public void addCompany(Company c) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_ID, c.getCompanyId());
    values.put(KEY_NAME, c.getCompanyName());
    values.put(KEY_RYG, c.getCompanyRedYellowGreen());
    values.put(KEY_COUNTRY, c.getCompanyCountry());
    values.put(KEY_URL, c.getCompanyUrl());
    values.put(KEY_NOTES, c.getCompanyNotes());
    values.put(KEY_EMAIL, c.getCompanyEmail());
    db.insertWithOnConflict(TABLE_COMPANY, null, values, SQLiteDatabase.CONFLICT_REPLACE);
    db.close();
}

これは、SQLiteに追加する前に各json要素を保持するクラスです(簡潔にするために、ゲッターとセッターは省略しています)。

public class Company {

    public Company() {
    }

    @SerializedName("id")
    public int companyId;

    @SerializedName("company_name")
    public String companyName;

    @SerializedName("red_yellow_green")
    public String companyRedYellowGreen;

    @SerializedName("country")
    public String companyCountry;

    @SerializedName("url")
    public String companyUrl;

    @SerializedName("notes")
    public String companyNotes;

    @SerializedName("email")
    public String companyEmail;

}

返信をよろしくお願いします。

4

1 に答える 1

5

最初に、プロセスの中で最も時間を消費している部分を特定する必要があります。上記のコメントから、JSON解析が原因のようです。

JSON解析が問題になる場合:
より高速なJSONパーサーを調査して検討します。おそらくjson-smartのようなものです。

SQLite / DBの一括挿入が問題になる場合:
ここで私の答えを参照してください

一般的なヒント:

  • オブジェクトを可能な限りリサイクルします(新品を最小限に抑えます)
  • 少なくともDB一括挿入では常にトランザクションを使用してください
  • データベースを開いたり閉じたりしないでください。処理の開始/終了時にこれを1回実行します
  • プリコンパイルされたステートメントを使用してください!
于 2012-05-31T17:44:15.557 に答える