4

私のアプリケーションでは、エキストラActivityを介してデータを送信しています。Intent

私の特定のケースでは、JSONファイルをダウンロードし、そのコンテンツを に変換し、追加として my にString送信します。サイズは約500kBです。IntentActivity

そして、私はTransactionTooLargeException.

09-28 13:40:46.647: E/JavaBinder(441): !!! FAILED BINDER TRANSACTION !!!
09-28 13:40:46.647: W/ActivityManager(441): Exception in new application when starting activity com.vektor.sourfer/.SourceActivity
09-28 13:40:46.647: W/ActivityManager(441): android.os.TransactionTooLargeException
09-28 13:40:46.647: W/ActivityManager(441):     at android.os.BinderProxy.transact(Native Method)
09-28 13:40:46.647: W/ActivityManager(441):     at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:723)
09-28 13:40:46.647: W/ActivityManager(441):     at com.android.server.am.ActivityStack.realStartActivityLocked(ActivityStack.java:716)
09-28 13:40:46.647: W/ActivityManager(441):     at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:4341)
09-28 13:40:46.647: W/ActivityManager(441):     at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:4405)
09-28 13:40:46.647: W/ActivityManager(441):     at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:390)
09-28 13:40:46.647: W/ActivityManager(441):     at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:1737)
09-28 13:40:46.647: W/ActivityManager(441):     at android.os.Binder.execTransact(Binder.java:388)
09-28 13:40:46.647: W/ActivityManager(441):     at dalvik.system.NativeStart.run(Native Method)
09-28 13:40:46.647: W/ActivityManager(441): Force removing ActivityRecord{421bbed8 u0 com.vektor.sourfer/.SourceActivity}: app died, no saved state

このような場合、このエラーを回避する最善の方法はどれですか?

4

3 に答える 3

4

転送されるデータ サイズには 1 MB の制限がありますが、実際にはそれよりも小さく、デバイス固有です。この文字列をどのように転送していますか? putExtra(String string) メソッド経由ですか? 可能であれば、文字ごとに 1 バイトだけを使用するスマートなことを行うため、Serializable としてラップするようにしてください。ただし、文字列がこれよりも大きくなる可能性がある場合は、制限に近すぎるため、おそらくディスクに保存し、まったく転送しないでください。

この件について、この例外を受け取った人にとって興味深いかもしれないブログ投稿を書きました。

于 2015-03-25T01:43:02.630 に答える
1

最初のアプローチ:Jsonを使用しているため、JsonReaderを使用します

https://sites.google.com/site/gson/streaming

このコードは、メッセージの配列を含む JSON ドキュメントを読み取ります。ドキュメント全体をメモリにロードしないように、配列要素をストリームとして処理します。Gson のオブジェクト モデルを使用して個々のメッセージを解析するため、簡潔です。

public List<Message> readJsonStream(InputStream in) throws IOException {
    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
    List<Message> messages = new ArrayList<Message>();
    reader.beginArray();
    while (reader.hasNext()) {
        Message message = gson.fromJson(reader, Message.class);
        messages.add(message);
    }
    reader.endArray();
    reader.close();
    return messages;
}

2 番目の方法: ファイルを保存し、ファイルの URI/パスを 2 番目のアクティビティに渡します。

于 2013-09-28T12:00:06.437 に答える