lundi 26 mai 2014

Why package manager dies and throws failed binder transaction every 5th time? How to work out this issue?


Vote count:

0




I have just only one package manager, a global one which im using everywhere. I have an ImageButton and onClick function. I am able to click 4 times in a row on image, and it works, slow but works and seems fine, almost the way I want it to work. But when I click on the ImageButton 5th time, 10th time, 15th time and etc, my app crashes. I've been looking around for answer and figured out that The Binder transaction buffer has a limited fixed size, currently 1Mb. But that shouldnt work every 1st time if buffer is overflown. Logcat:



05-26 13:39:41.427: E/JavaBinder(16678): !!! FAILED BINDER TRANSACTION !!!
05-26 13:39:41.447: D/AndroidRuntime(16678): Shutting down VM
05-26 13:39:41.447: W/dalvikvm(16678): threadid=1: thread exiting with uncaught exception (group=0x40ab1210)
05-26 13:39:41.487: E/AndroidRuntime(16678): FATAL EXCEPTION: main
05-26 13:39:41.487: E/AndroidRuntime(16678): java.lang.IllegalStateException: Could not execute method of the activity
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.view.View$1.onClick(View.java:3103)
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.view.View.performClick(View.java:3574)
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.view.View$PerformClick.run(View.java:14293)
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.os.Handler.handleCallback(Handler.java:605)
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.os.Handler.dispatchMessage(Handler.java:92)
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.os.Looper.loop(Looper.java:137)
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.app.ActivityThread.main(ActivityThread.java:4448)
05-26 13:39:41.487: E/AndroidRuntime(16678): at java.lang.reflect.Method.invokeNative(Native Method)
05-26 13:39:41.487: E/AndroidRuntime(16678): at java.lang.reflect.Method.invoke(Method.java:511)
05-26 13:39:41.487: E/AndroidRuntime(16678): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
05-26 13:39:41.487: E/AndroidRuntime(16678): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
05-26 13:39:41.487: E/AndroidRuntime(16678): at dalvik.system.NativeStart.main(Native Method)
05-26 13:39:41.487: E/AndroidRuntime(16678): Caused by: java.lang.reflect.InvocationTargetException
05-26 13:39:41.487: E/AndroidRuntime(16678): at java.lang.reflect.Method.invokeNative(Native Method)
05-26 13:39:41.487: E/AndroidRuntime(16678): at java.lang.reflect.Method.invoke(Method.java:511)
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.view.View$1.onClick(View.java:3098)
05-26 13:39:41.487: E/AndroidRuntime(16678): ... 11 more
05-26 13:39:41.487: E/AndroidRuntime(16678): Caused by: java.lang.RuntimeException: Package manager has died
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:75)
05-26 13:39:41.487: E/AndroidRuntime(16678): at com.xxx.MainActivity.appInstalled(MainActivity.java:150)
05-26 13:39:41.487: E/AndroidRuntime(16678): at com.xxx.MainActivity.chooseApps(MainActivity.java:180)
05-26 13:39:41.487: E/AndroidRuntime(16678): ... 14 more
05-26 13:39:41.487: E/AndroidRuntime(16678): Caused by: android.os.TransactionTooLargeException
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.os.BinderProxy.transact(Native Method)
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.content.pm.IPackageManager$Stub$Proxy.getPackageInfo(IPackageManager.java:1209)
05-26 13:39:41.487: E/AndroidRuntime(16678): at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:70)
05-26 13:39:41.487: E/AndroidRuntime(16678): ... 16 more


Code:



private boolean appInstalled(String uri)
{
boolean app_installed = false;
try
{
packageMngr.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
app_installed = true;
}
catch (PackageManager.NameNotFoundException e)
{
app_installed = false;
}
return app_installed ;
}

public void chooseApps(View view) {
if (sharedAppPreferences.contains(AppsListKey)) {
AppNames = new ArrayList<String>();
PackageNames = new ArrayList<String>();
CheckedItems = new ArrayList<Boolean>();
try {
JSONArray AppNamesBuffer = new JSONArray(sharedAppPreferences.getString(
AppsListKey, ""));
JSONArray PackageNamesBuffer = new JSONArray(sharedAppPreferences.getString(
PackageNamesListKey, ""));
JSONArray CheckItemsBuffer = new JSONArray(sharedAppPreferences.getString(
CheckItemsListKey, ""));
AppNames.clear();
PackageNames.clear();
CheckedItems.clear();
for (int i=0;i<AppNamesBuffer.length();i++) {
if (appInstalled(PackageNamesBuffer.get(i).toString())) {
AppNames.add(AppNamesBuffer.get(i).toString());
PackageNames.add(PackageNamesBuffer.get(i).toString());
CheckedItems.add(Boolean.valueOf(CheckItemsBuffer.get(i).toString()));
}
}

} catch (JSONException e) {
e.printStackTrace();
}
} else {
AppNames = new ArrayList<String>();
PackageNames = new ArrayList<String>();
CheckedItems = new ArrayList<Boolean>();
}
int flags = PackageManager.GET_META_DATA | PackageManager.GET_SHARED_LIBRARY_FILES | PackageManager.GET_UNINSTALLED_PACKAGES;
List<ApplicationInfo> packageList = packageMngr.getInstalledApplications(flags);

for (ApplicationInfo pack : packageList) {

if ((pack.flags & ApplicationInfo.FLAG_SYSTEM) != 0 || AppNames.contains(pack.loadLabel(packageMngr).toString())) {
} else {
AppNames.add(pack.loadLabel(packageMngr).toString());
PackageNames.add(pack.packageName);
CheckedItems.add(false);
}
}
Editor editor = sharedAppPreferences.edit();
String AppNamesBuffer = new JSONArray(AppNames).toString();
String PackageNamesBuffer = new JSONArray(PackageNames).toString();
String CheckedItemsBuffer = new JSONArray(CheckedItems).toString();
editor.putString(AppsListKey, AppNamesBuffer);
editor.putString(PackageNamesListKey, PackageNamesBuffer);
editor.putString(CheckItemsListKey, CheckedItemsBuffer);
editor.commit();
AppList appList = new AppList();
appList.show(getSupportFragmentManager(), "AppList");
}


Line 150 would be: packageMngr.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);


And line 180: if (appInstalled(PackageNamesBuffer.get(i).toString())) {



asked 2 mins ago






Aucun commentaire:

Enregistrer un commentaire