Ich habe eine TransactionTooLargeException
. Nicht reproduzierbar. In den Dokumenten steht
Die Binder-Transaktion ist fehlgeschlagen, weil sie zu groß war.
Während eines Remoteprozeduraufrufs werden die Argumente und der Rückgabewert des Aufrufs als Paketobjekte übertragen, die im Binder-Transaktionspuffer gespeichert sind. Wenn die Argumente oder der Rückgabewert zu groß sind, um in den Transaktionspuffer zu passen, schlägt der Aufruf fehl und TransactionTooLargeException wird ausgelöst.
...
Es gibt zwei mögliche Ergebnisse, wenn ein Remoteprozeduraufruf eine TransactionTooLargeException auslöst. Entweder konnte der Client seine Anforderung nicht an den Dienst senden (höchstwahrscheinlich, wenn die Argumente zu groß waren, um in den Transaktionspuffer zu passen), oder der Dienst konnte seine Antwort nicht an den Client zurücksenden (höchstwahrscheinlich, wenn der Rückgabewert war zu groß, um in den Transaktionspuffer zu passen).
...
Irgendwo übergebe oder erhalte ich Argumente, die eine unbekannte Grenze überschreiten. Wo?
Die Stapelverfolgung zeigt nichts Nützliches:
java.lang.RuntimeException: Adding window failed
at android.view.ViewRootImpl.setView(ViewRootImpl.java:548)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:406)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:320)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:152)
at android.view.Window$LocalWindowManager.addView(Window.java:557)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2897)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$600(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4977)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.os.TransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.view.IWindowSession$Stub$Proxy.add(IWindowSession.java:569)
at android.view.ViewRootImpl.setView(ViewRootImpl.java:538)
... 16 more
android.os.TransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.view.IWindowSession$Stub$Proxy.add(IWindowSession.java:569)
at android.view.ViewRootImpl.setView(ViewRootImpl.java:538)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:406)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:320)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:152)
at android.view.Window$LocalWindowManager.addView(Window.java:557)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2897)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$600(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4977)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Es scheint mit Ansichten verbunden zu sein? Wie hängt dies mit dem Remoteprozeduraufruf zusammen?
Möglicherweise wichtig: Android-Version: 4.0.3, Gerät: HTC One X.
Antworten:
Ich bin auf dieses Problem gestoßen und habe festgestellt, dass beim Austausch einer großen Datenmenge zwischen einem Dienst und einer Anwendung viele Miniaturansichten übertragen werden. Tatsächlich betrug die Datengröße etwa 500 KB, und die IPC-Transaktionspuffergröße ist auf 1024 KB festgelegt. Ich bin nicht sicher, warum es den Transaktionspuffer überschritten hat.
Dies kann auch auftreten, wenn Sie viele Daten durch Absichts-Extras übergeben
Wenn Sie diese Ausnahme in Ihrer Anwendung erhalten, analysieren Sie bitte Ihren Code.
Vorgehensweise, wenn Sie diese Ausnahme erhalten
Wenn möglich, teilen Sie die große Operation in kleine Blöcke auf. Rufen Sie beispielsweise anstelle von applyBatch () mit 1000 Operationen jeweils 100 auf.
Tauschen Sie keine großen Datenmengen (> 1 MB) zwischen Diensten und Anwendungen aus
Ich weiß nicht, wie ich das machen soll, aber frage Android nicht ab, da es riesige Datenmengen zurückgeben kann :-)
quelle
getInstalledApplications
. Was kann getan werden, um dies zu lösen?Wenn Sie untersuchen müssen, welches Paket Ihren Absturz verursacht, sollten Sie TooLargeTool ausprobieren .
(Ich fand dies als Kommentar von @Max Spencer unter der akzeptierten Antwort und es war in meinem Fall hilfreich.)
quelle
bundle.clear()
Dies ist keine endgültige Antwort, kann jedoch Aufschluss über die Ursachen von a geben
TransactionTooLargeException
und dabei helfen, das Problem zu lokalisieren.Obwohl sich die meisten Antworten auf große übertragene Datenmengen beziehen, wird diese Ausnahme zufällig nach starkem Scrollen und Zoomen und wiederholtem Öffnen eines ActionBar-Drehfeldmenüs ausgelöst. Der Absturz tritt beim Tippen auf die Aktionsleiste auf. (Dies ist eine benutzerdefinierte Mapping-App)
Die einzigen Daten, die weitergegeben werden, scheinen Berührungen vom "Input Dispatcher" an die App zu sein. Ich denke, dass dies im "Transaktionspuffer" nicht annähernd 1 MB betragen kann.
Meine App läuft auf einem 1,6-GHz-Quad-Core-Gerät und verwendet 3 Threads für das Heavy-Lifting, wobei ein Core für den UI-Thread frei bleibt. Darüber hinaus verwendet die App android: largeHeap, hat noch 10 MB unbenutzten Heap und 100 MB Platz, um den Heap zu vergrößern. Ich würde also nicht sagen, dass es sich um ein Ressourcenproblem handelt.
Dem Absturz gehen immer unmittelbar folgende Zeilen voraus:
Die nicht unbedingt in dieser Reihenfolge gedruckt werden, sondern (soweit ich das überprüft habe) in derselben Millisekunde erfolgen.
Und die Stapelverfolgung selbst ist der Klarheit halber dieselbe wie in der Frage:
Wenn man sich mit dem Quellcode von Android befasst, findet man folgende Zeilen:
Frameworks / base / core / jni / android_util_Binder.cpp:
Für mich klingt es so, als würde ich möglicherweise auf diese undokumentierte Funktion stoßen, bei der die Transaktion aus anderen Gründen als einer zu großen Transaktion fehlschlägt. Sie hätten es benennen sollen
TransactionTooLargeOrAnotherReasonException
.Zu diesem Zeitpunkt habe ich das Problem nicht gelöst, aber wenn ich etwas Nützliches finde, werde ich diese Antwort aktualisieren.
Update: Es stellte sich heraus, dass mein Code einige Dateideskriptoren durchgesickert ist, deren Anzahl unter Linux maximiert ist (normalerweise 1024), und dies scheint die Ausnahme ausgelöst zu haben. Es war also doch ein Ressourcenproblem. Ich habe dies durch
/dev/zero
1024- maliges Öffnen überprüft , was zu allerlei seltsamen Ausnahmen bei Aktionen im Zusammenhang mit der Benutzeroberfläche führte, einschließlich der obigen Ausnahme und sogar einiger SIGSEGVs. Anscheinend wird das Versagen beim Öffnen einer Datei / eines Sockets in Android nicht sehr sauber gehandhabt / gemeldet.quelle
Das
TransactionTooLargeException
plagt uns seit ungefähr 4 Monaten und wir haben das Problem endlich gelöst!Was geschah, war, dass wir a
FragmentStatePagerAdapter
in a verwendenViewPager
. Der Benutzer blättert durch und erstellt mehr als 100 Fragmente (es ist eine Leseanwendung).Obwohl wir die Fragmente ordnungsgemäß verwalten
destroyItem()
, gibt es in der Androids-ImplementierungFragmentStatePagerAdapter
einen Fehler, bei dem auf die folgende Liste verwiesen wurde:Und wenn Android
FragmentStatePagerAdapter
versucht, den Status zu speichern, wird die Funktion aufgerufenWie Sie sehen können,
FragmentStatePagerAdapter
speichert die Basisklasse auch dann, wenn Sie die Fragmente in der Unterklasse ordnungsgemäß verwalten , einFragment.SavedState
für jedes einzelne jemals erstellte Fragment. DasTransactionTooLargeException
würde auftreten, wenn dieses Array auf a ausgegeben wurdeparcelableArray
und das Betriebssystem es nicht mehr als 100 Elemente mögen würde.Deshalb ist die Lösung für uns war es, die außer Kraft zu setzen
saveState()
Methode und nicht für den Shop etwas"states"
.quelle
@Override public Parcelable saveState() { Bundle bundle = (Bundle) super.saveState(); if (bundle != null) { Parcelable[] states = bundle.getParcelableArray("states"); // Subset only last 3 states if (states != null) states = Arrays.copyOfRange(states, states.length > 3 ? states.length - 3 : 0, states.length - 1); bundle.putParcelableArray("states", states); } else bundle = new Bundle(); return bundle; }
Wenn Sie auf der Suche nach einer Antwort auf die Frage, warum die TransactionTooLargeException angezeigt wird, bitter enttäuscht sind, versuchen Sie zu überprüfen, wie viele Informationen Sie im Status der Instanz speichern.
Auf compile / targetSdkVersion <= 23 haben wir nur eine interne Warnung über die Größe des gespeicherten Status, aber nichts ist abgestürzt:
Aber bei compile / targetSdkVersion> = 24 haben wir in diesem Fall einen echten RuntimeException-Absturz :
Was ist zu tun?
Speichern Sie Daten in der lokalen Datenbank und behalten Sie nur die IDs im Instanzstatus bei, mit denen Sie diese Daten abrufen können.
quelle
Diese Ausnahme wird normalerweise ausgelöst, wenn die App in den Hintergrund gesendet wird.
Deshalb habe ich mich entschlossen, die Datenfragment-Methode zu verwenden, um das vollständig zu umgehen
onSavedInstanceStae
Lebenszyklus . Meine Lösung verarbeitet auch komplexe Instanzzustände und gibt so schnell wie möglich Speicher frei.Zuerst habe ich ein einfaches Fargement zum Speichern der Daten erstellt:
Bei meiner Hauptaktivität umgehe ich dann den gespeicherten Instanzzyklus vollständig und verschiebe die Verantwortlichkeit für mein Datenfragment. Sie müssen dies nicht für die Fragmente selbst verwenden, da ihr Status automatisch zum Status der Aktivität hinzugefügt wird.
Was bleibt, ist einfach die gespeicherte Instanz zu öffnen:
Ausführliche Informationen: http://www.devsbedevin.net/avoiding-transactiontoolargeexception-on-android-nougat-and-up/
quelle
onSavedState()
, was in vielen Fällen der Fall ist. Konfigurationsänderung ist eine. Das Wechseln von Apps und das Wechseln in den Hintergrund sind weitere. Und es gibt noch mehr.Es gibt keine spezifische Ursache für dieses Problem. In meiner Fragment-Klasse habe ich Folgendes getan:
an Stelle von:
quelle
Es ist wichtig zu verstehen, dass der Transaktionspuffer unabhängig von den Gerätefunktionen oder der App auf 1 MB begrenzt ist. Dieser Puffer wird bei allen API-Aufrufen verwendet und von allen Transaktionen gemeinsam genutzt, die derzeit von einer App ausgeführt werden.
Ich glaube, es enthält auch ein bestimmtes Objekt wie Pakete und dergleichen
(Parcel.obtain())
, daher ist es wichtig, immer jedesobtain()
mit einem abzugleichenrecycle()
.Dieser Fehler kann leicht bei API-Aufrufen auftreten, die viele Daten zurückgeben, obwohl die zurückgegebenen Daten weniger als 1 MB betragen (wenn noch andere Transaktionen ausgeführt werden).
Der
PackageManager.getInstalledApplication()
Aufruf gibt beispielsweise eine Liste aller installierten Apps zurück. Durch Hinzufügen bestimmter Flags können viele zusätzliche Daten abgerufen werden. Dies schlägt wahrscheinlich fehl. Es wird daher empfohlen, keine zusätzlichen Daten abzurufen und diese pro App abzurufen.Der Anruf kann jedoch immer noch fehlschlagen. Daher ist es wichtig, ihn mit einem zu umgeben
catch
und bei Bedarf erneut versuchen zu können.Soweit ich weiß, gibt es keine Lösung für ein solches Problem, außer es erneut zu versuchen und sicherzustellen, dass so wenig Informationen wie möglich abgerufen werden.
quelle
Ich habe auch diese Ausnahme auf einem Samsung S3. Ich vermute 2 Grundursachen,
Verwenden Sie DDMS und sehen Sie sich Ihren Heap an, während Sie Ihre App abspielen. Dies gibt Ihnen einen Hinweis darauf, welche setcontentview das Problem verursacht.
Ich habe alle Drawables in alle Ordner kopiert, um Problem 2 zu beseitigen.
Problem ist behoben.
quelle
Fügen Sie dies Ihrer Aktivität hinzu
Es funktioniert bei mir, hoffe es hilft dir auch
quelle
onCreate()
?Für uns war es also der Versuch, ein zu großes Objekt über unsere AIDL-Schnittstelle an einen Remote-Dienst zu senden. Die Transaktionsgröße darf 1 MB nicht überschreiten. Die Anforderung wird in separate Blöcke von 512 KB unterteilt und einzeln über die Schnittstelle gesendet. Eine brutale Lösung, die ich kenne, aber hey - es ist Android :(
quelle
Sie haben Ihren alten InstanceState von der onSaveInstanceState- Methode gelöscht , und es wird gut funktionieren. Ich verwende FragmentStatePagerAdapter für meinen Viewpager, daher behalte ich die Überschreibungsmethode in meiner übergeordneten Aktivität bei, um InstanceState zu löschen.
Ich habe diese Lösung von hier aus gefunden android.os.TransactionTooLargeException auf Nougat
quelle
Kürzlich bin ich auch auf einen interessanten Fall gestoßen, als ich mit dem Kontaktanbieter von Android gearbeitet habe .
Ich musste Fotos von Kontakten aus der internen Kontaktdatenbank laden und gemäß der Systemarchitektur werden alle diese Daten durch Abfragen an den Kontaktanbieter geliefert.
Da es sich um eine separate Anwendung handelt, werden alle Arten der Datenübertragung mithilfe des Binder-Mechanismus ausgeführt, sodass hier der Binder-Puffer ins Spiel kommt.
Mein Hauptfehler war , dass ich nicht in der Nähe war das
Cursor
mit Blob - Daten aus den Kontakten Provider bekommen, so dass der Speicher für den Provider zugewiesen erhöht und diese aufgeblasen der Binder puffern , bis ich Tonnen bekam von!!!FAILED BINDER TRANSACTION!!!
Nachrichten in meinem LogCat ausgegeben.Die Hauptidee ist also, dass Sie, wenn Sie mit externen Inhaltsanbietern arbeiten und
Cursor
s von diesen erhalten, diese immer schließen, wenn Sie mit ihnen fertig sind.quelle
Ich hatte das gleiche Problem, als ich versuchte, eine Bitmap über Intent zu senden, und gleichzeitig, als es passierte, faltete ich die Anwendung.
Wie es in diesem Artikel beschrieben wird, geben Sie hier die Linkbeschreibung ein eine Linkbeschreibung ein. geschieht, wenn eine Aktivität gerade gestoppt wird. bedeutet, dass die Aktivität versucht hat, ihre gespeicherten Statuspakete an das Systembetriebssystem zu senden, um sie später (nach einer Konfigurationsänderung) sicher wiederherzustellen oder Prozess Tod), aber dass eines oder mehrere der von ihm gesendeten Bundles zu groß waren.
Ich habe es per Hack gelöst, indem ich onSaveInstanceState in meiner Aktivität überschrieben habe:
und Kommentar super anrufen. Es ist ein schmutziger Hack, aber es funktioniert perfekt. Bitmap wurde erfolgreich ohne Abstürze gesendet. Hoffe das wird jemandem helfen.
quelle
In meinem Fall erhalte ich TransactionTooLargeException als sekundären Absturz, nachdem die native Bibliothek mit SIGSEGV abgestürzt ist. Der Absturz der nativen Bibliothek wird nicht gemeldet, daher erhalte ich nur TransactionTooLargeException.
quelle
Ich habe dies in meinem Syncadapter erhalten, als ich versuchte, einen großen ContentValues [] einzufügen. Ich habe beschlossen, es wie folgt zu beheben:
quelle
Für mich war es auch das
FragmentStatePagerAdapter
, aber das ÜberschreibensaveState()
hat nicht funktioniert. So habe ich es behoben:Behalten Sie beim Aufrufen des
FragmentStatePagerAdapter
Konstruktors eine separate Liste der Fragmente in der Klasse bei und fügen Sie eine Methode zum Entfernen der Fragmente hinzu:Dann in der
Activity
, speichern Sie dieViewPager
Position und Rufadapter.removeFragments()
in der überschriebenenonSaveInstanceState()
Methode:Zuletzt
onResume()
instanziieren Sie in der überschriebenen Methode den Adapter erneut, wenn dies nicht der Fall istnull
. (Wenn esnull
dann dasActivity
wird zum ersten Mal geöffnet oder nach der App von Android abgetötet wurde, bei demonCreate
die Adaptererstellung tun.)quelle
Stellen Sie sicher, dass Sie keine großen Objektdaten in Intent einfügen. In meinem Fall habe ich String 500k Größe hinzugefügt und dann eine andere Aktivität gestartet. Mit dieser Ausnahme ist es immer fehlgeschlagen. Ich habe es vermieden, Daten zwischen Aktivitäten auszutauschen, indem ich statische Variablen von Aktivitäten verwendet habe - Sie müssen sie nicht an Intent senden und dann daraus ziehen.
Was ich hatte:
quelle
Wenn ich mich mit dem
WebView
in meiner App beschäftige, passiert es. Ich denke, es hängt mitaddView
und UI-Ressourcen zusammen. In meiner App füge ichWebViewActivity
unten einen Code hinzu, dann läuft er in Ordnung:quelle
Ich habe die Hauptursache dafür gefunden (wir haben sowohl "Fenster hinzugefügt" fehlgeschlagen als auch Dateideskriptor-Leck, wie mvds sagt).
Es gibt einen Fehler in
BitmapFactory.decodeFileDescriptor()
Android 4.4. Es tritt nur auf, wenninPurgeable
undinInputShareable
von eingestelltBitmapOptions
sindtrue
. Dies führt an vielen Stellen zu Problemen bei der Interaktion mit Dateien.Beachten Sie, dass die Methode auch von aufgerufen wird
MediaStore.Images.Thumbnails.getThumbnail()
.Universal Image Loader ist von diesem Problem betroffen. Picasso und Glide scheinen nicht betroffen zu sein. https://github.com/nostra13/Android-Universal-Image-Loader/issues/1020
quelle
Diese eine Codezeile in der Methode writeToParcel (Parcel dest, int flags) hat mir geholfen, die TransactionTooLargeException loszuwerden.
Nur nach diesem Code schreibe ich alle Daten in das Paketobjekt, dh dest.writeInt () usw.
quelle
Versuchen Sie, eine Lösung zu verwenden
EventBus
oder zuContentProvider
mögen.Wenn Sie sich im selben Prozess befinden (normalerweise sind dies alle Ihre Aktivitäten), versuchen Sie es zu verwenden
EventBus
, da der Datenaustausch im Prozess KEINEN Puffer benötigt, sodass Sie sich keine Sorgen machen müssen, dass Ihre Daten zu groß sind. (Sie können einfach einen Methodenaufruf verwenden, um Daten zu übergeben, und EventBus versteckt die hässlichen Dinge.) Hier ist das Detail:Wenn sich die beiden Seiten von Intent nicht im selben Prozess befinden, versuchen Sie etwas
ContentProvider
.Siehe TransactionTooLargeException
quelle
Ich habe eine TransactionTooLargeException aufgrund eines Stackoverflow-Fehlers in einem Android-Espresso-Test erhalten. Ich habe den Stackoverflow-Fehler-Stack-Trace in den Protokollen gefunden, als ich den Logcat-Filter für meine App entfernt habe.
Ich vermute, dass Espresso die TransactionTooLargeException verursacht hat, als versucht wurde, eine wirklich große Ausnahme-Stacktrace zu verarbeiten.
quelle
Man kann verwenden:
im Android Manifest unter Application Tag.
Dies löste das Problem in meinem Fall!
quelle
onSaveInstantState
Aktivitäten / Fragmente aufgerufen und große Listen gespeichert habe) hat es nicht geholfen.Ich hatte auch dieses Problem mit Bitmap-Daten, die von einer Aktivität zur nächsten übertragen wurden, aber ich mache eine Lösung, indem ich meine Daten als statische Daten mache, und dies funktioniert perfekt für mich
In der Aktivität zuerst:
und in der zweiten Aktivität:
quelle
Dies geschah in meiner App, weil ich eine Liste von Suchergebnissen in den Argumenten eines Fragments übergab und diese Liste einer Eigenschaft des Fragments zuwies - die eigentlich ein Verweis auf denselben Speicherort ist, auf den die Argumente des Fragments zeigen - und dann hinzufügte neue Elemente in der Liste, die auch die Größe der Argumente des Fragments geändert haben. Wenn die Aktivität angehalten wird, versucht die Basisfragmentklasse, die Argumente des Fragments in onSaveInstanceState zu speichern. Dies stürzt ab, wenn die Argumente größer als 1 MB sind. Beispielsweise:
Die einfachste Lösung in diesem Fall bestand darin, der Eigenschaft des Fragments eine Kopie der Liste zuzuweisen, anstatt eine Referenz zuzuweisen:
Eine noch bessere Lösung wäre, nicht so viele Daten in den Argumenten weiterzugeben.
Ohne diese Antwort und TooLargeTool hätte ich das wahrscheinlich nie gefunden .
quelle
Ich habe auch TransactionTooLargeException gelebt. Erstens habe ich daran gearbeitet zu verstehen, wo es auftritt. Ich kenne den Grund, warum es auftritt. Jeder von uns weiß es wegen des großen Inhalts. Mein Problem war so und ich löste. Vielleicht kann diese Lösung für jeden nützlich sein. Ich habe eine App, die Inhalte von API erhält. Ich erhalte das Ergebnis der API im ersten Bildschirm und sende es an den zweiten Bildschirm. Ich kann diesen Inhalt erfolgreich an den zweiten Bildschirm senden. Nach dem zweiten Bildschirm tritt diese Ausnahme auf, wenn ich zum dritten Bildschirm wechseln möchte. Jeder meiner Bildschirme wird aus Fragment erstellt. Ich bemerkte das, als ich vom zweiten Bildschirm ging. Es speichert seinen Bundle-Inhalt. Wenn dieser Inhalt zu groß ist, tritt diese Ausnahme auf. Meine Lösung ist, nachdem ich Inhalte aus dem Bundle erhalten habe, lösche ich sie.
quelle
Eine Lösung wäre, dass die App die ArrayList (oder das Objekt, das das Problem verursacht) in das Dateisystem schreibt, dann einen Verweis auf diese Datei (z. B. Dateiname / Pfad) über den Intent an den IntentService übergibt und dann den IntentService überlässt Rufen Sie den Dateiinhalt ab und konvertieren Sie ihn zurück in eine ArrayList.
Wenn der IntentService mit der Datei fertig ist, sollte er sie entweder löschen oder die Anweisung über einen lokalen Broadcast an die App zurückgeben, um die von ihm erstellte Datei zu löschen (wobei dieselbe Dateireferenz zurückgegeben wird, die ihm bereitgestellt wurde).
Weitere Informationen finden Sie in meiner Antwort auf dieses Problem .
quelle
Als Absichten, Inhaltsanbieter, Messenger verwenden alle Systemdienste wie Telefon, Vibrator usw. den IPC-Infrastrukturanbieter von Binder. Darüber hinaus verwenden die Rückrufe im Aktivitätslebenszyklus auch diese Infrastruktur.
1 MB ist das Gesamtlimit für alle Bindertransaktionen, die zu einem bestimmten Zeitpunkt im System ausgeführt werden.
Wenn beim Senden der Absicht viele Transaktionen stattfinden, kann dies fehlschlagen, obwohl zusätzliche Daten nicht groß sind. http://codetheory.in/an-overview-of-android-binder-framework/
quelle
Bei so vielen Stellen, an denen TransactionTooLargeException auftreten kann - hier ist eine weitere Neuerung für Android 8 - ein Absturz, wenn jemand nur anfängt, einen EditText einzugeben, wenn der Inhalt zu groß ist.
Es bezieht sich auf den AutoFillManager (neu in API 26) und den folgenden Code in
StartSessionLocked()
:Wenn ich das richtig verstehe, ruft dies den AutoFill-Dienst auf und übergibt den AutofillManagerClient im Ordner. Und wenn der EditText viel Inhalt hat, scheint er den TTLE zu verursachen.
Ein paar Dinge können es mildern (oder haben es sowieso getan, wie ich es getestet habe): Fügen Sie
android:importantForAutofill="noExcludeDescendants"
die XML-Layoutdeklaration von EditText hinzu. Oder im Code:Eine zweite schreckliche, schreckliche Problemumgehung könnte auch darin bestehen, die Methoden
performClick()
und zu überschreibenonWindowFocusChanged()
, um den Fehler in einer TextEdit-Unterklasse selbst abzufangen. Aber ich denke nicht, dass das wirklich klug ist ...quelle