2012-11-05 10 views

Antwort

5

Diese Ausnahme ist unter normalen Umständen nur schwer reproduzierbar. Sie erhalten diese Ausnahme, wenn der IPC-Speicher beim Übertragen von Daten erschöpft ist. Dies kann in beiden Fällen auftreten, wenn ein Dienst versucht, Daten an den Client zu senden oder ein Client Daten an den Dienst sendet. Höchstwahrscheinlich haben einige Ihrer Benutzer eine große Anzahl von Anwendungen installiert, was zu einer Datengröße von mehr als 1 MB führt (was der Größe des IPC-Puffers entspricht).

Ich fürchte, in diesem Fall werden Sie nichts besseres tun. Wenn Sie jedoch etwas wie applyBatch ausführen, können Sie eine große Transaktion in mehrere kleinere Transaktionen aufteilen.

haben auch einen Blick auf diesen Thread What to do on TransactionTooLargeException

+0

Danke dafür. Weißt du, ob es eine Möglichkeit gibt, die Anwendungsinformationen auf andere Weise zu erhalten? Ich brauche nicht unbedingt jede App mit allen Infos auf einmal. Es wäre wahrscheinlich besser, wenn ich nur eine Liste der Apps abrufen und dann nach einzelnen Abfragen fragen könnte, um das erforderliche ApplicationInfo-Objekt zurück zu bekommen, so dass die Transaktion nicht so groß war. – Andrew

+0

Ich kann PackageManager getApplicationInfo (String packageName, int-Flags) sehen, die so aussieht. Ich denke, ich kann dies kombinieren mit: getInstalledPackages, um die Daten möglicherweise ohne dieses Problem zu erhalten. – Andrew

+2

Statt: Liste packages = pm.getInstalledApplications (PackageManager.GET_META_DATA); Ich verwende jetzt: Liste packs = pm.getInstalledPackages (0); \t Liste packages = new ArrayList (); \t für (int i = 0; i Andrew

12

ich gefunden habe, dass dies auf Android 5.1 (Nachweis here, wenn nach „Fix Paket-Manager TransactionTooLargeExceptions“) gelöst wurde, wie es auf mehreren Stellen gemeldet wurde:

Allerdings wollte ich das vor 5.1 lösen, also habe ich mir eine Lösung ausgedacht (und vorgeschlagen, Google in die Support-Bibliothek zu legen, hier). Hier ist eine kurze Code-Version von dem, was ich vorgeschlagen habe:

public static List<PackageInfo> getInstalledPackages(Context context,int flags) 
    { 
    final PackageManager pm=context.getPackageManager(); 
    try 
     { 
     return pm.getInstalledPackages(flags); 
     } 
    catch(Exception ignored) 
     { 
     //we don't care why it didn't succeed. We'll do it using an alternative way instead 
     } 
    // use fallback: 
    Process process; 
    List<PackageInfo> result=new ArrayList<>(); 
    BufferedReader bufferedReader=null; 
    try 
     { 
     process=Runtime.getRuntime().exec("pm list packages"); 
     bufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String line; 
     while((line=bufferedReader.readLine())!=null) 
     { 
     final String packageName=line.substring(line.indexOf(':')+1); 
     final PackageInfo packageInfo=pm.getPackageInfo(packageName,flags); 
     result.add(packageInfo); 
     } 
     process.waitFor(); 
     } 
    catch(Exception e) 
     { 
     e.printStackTrace(); 
     } 
    finally 
     { 
     if(bufferedReader!=null) 
     try 
      { 
      bufferedReader.close(); 
      } 
     catch(IOException e) 
      { 
      e.printStackTrace(); 
      } 
     } 
    return result; 
    } 

Was sie tut, es zu versuchen, zuerst den offiziellen Weg verwendet wird, und dann, wenn versäumt, holt sie die Paketnamen ADB-Befehl, und erhalten die Informationen von jeder der Apps, einer nach dem anderen.

Es ist viel langsamer als das offizielle, aber es ist nicht für mich abgestürzt. Ich habe es auf Android-Emulatoren (2.3.x bis einschließlich 5.0.x) und auch auf echten Geräten getestet.

Die Zeit, die es dauerte auf meinem Gerät (Galaxy S3 mit benutzerdefinierten ROM von Android 5.1) ist 1375-2012 ms (auf 197 Apps insgesamt) im Vergleich zu 37-65 ms mit dem offiziellen Weg.


EDIT: Leute behaupten hier, dass es nicht auf Android 5.1 behoben ist. Ich hoffe, dass es auf Android 6 behoben wurde.

+0

Ihre Lösung verwendet getInstalledPackages() anstelle von getInstalledApplications. Gibt es einen Grund? Arbeitet es nur mit der ersten Version? – greywolf82

+0

@ greywolf82 Ich bin mir ziemlich sicher, dass beide das gleiche Problem bekommen können. Es könnte sein, dass "getInstalledApplications" ein bisschen kleinere Objekte enthält (da PacakgeInfo mehr hat, was Sie damit tun können), wodurch dieses Problem bei einer größeren Anzahl von Apps im Vergleich zu getInstalledPackages auftreten kann. Auf jeden Fall werden beide Funktionen Ihnen die Liste der installierten Apps zurückgeben. –

+0

Ich habe gerade die TransactionTooLarge-Ausnahme auf einem Sony Experia Z3 unter 5.1.1 –

Verwandte Themen