1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Failed Binder Transaction

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von FelixL, 25.09.2010.

  1. FelixL, 25.09.2010 #1
    FelixL

    FelixL Threadstarter Ehrenmitglied

    Beiträge:
    4,855
    Erhaltene Danke:
    754
    Registriert seit:
    26.11.2009
    Phone:
    Wileyfox Swift, HTC One M8
    Ich baue gerade an einem App-Switcher, der meiste Teil ist momentan von einem Proof of Concept übernommen (Code hier: ruqqq's ActivityThumbnailPrototype-Application at master - GitHub).

    Allerdings bekomme ich jetzt folgende Fehlermeldung:
    Code:
    09-25 17:55:17.292: INFO/ActivityManager(356): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.felixl.aswitcher/.MainActivity bnds=[3,138][77,217] }
    09-25 17:55:17.342: DEBUG/ActivityThumbnailPrototype(3828): onCreate Anfang
    09-25 17:55:17.352: DEBUG/ActivityThumbnailPrototype(3828): [com.felixl.aswitcher.MainActivity, com.fede.launcher.Launcher]
    09-25 17:55:17.352: DEBUG/ActivityThumbnailPrototype(3828): onCreate geschafft
    09-25 17:55:17.362: DEBUG/ActivityThumbnailPrototype(3828): onResume 0
    09-25 17:55:17.362: DEBUG/ActivityThumbnailPrototype(3828): onResume 1
    09-25 17:55:17.382: DEBUG/ActivityThumbnailPrototype(3828): android.app.ActivityManager@44101d68
    09-25 17:55:17.462: ERROR/JavaBinder(3828): !!! FAILED BINDER TRANSACTION !!!
    09-25 17:55:17.462: DEBUG/ActivityThumbnailPrototype(3828): onResume 2
    09-25 17:55:17.462: DEBUG/ActivityThumbnailPrototype(3828): []
    Im Internet finde ich extrem wenig zu Failed Binder Transaction, aber es gibt Hinweise darauf das das mit großen Bildern zu tun hat.
    Allerdings tritt der Fehler bei mir nur auf wenn ich
    a) den Bildschirm drehe während die App offen ist oder
    b) die App über den Home-Button verlasse, den Bildschirm drehe und dann wieder öffne.

    Er tritt nicht auf wenn ich
    c) die App über den Back-Knopf verlasse, den Bildschirm drehe und dann wieder öffne oder
    d) den Bildschirm nicht drehe und die App öffne oder schließe.

    Nachschlag: Okay, jetzt ist egal was ich mache, der Fehler kommt immer :D

    Mein Sourcecode:
    Code:
    package com.felixl.aswitcher;
    
    import static android.util.Log.d;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.app.ActivityManager;
    import android.content.Intent;
    //import android.content.DialogInterface;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    //import android.view.View;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnClickListener;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    
    public class MainActivity extends Activity {
    	public static String LOG_TAG = "ActivityThumbnailPrototype";
    	public ActivityManager am;
    	LinearLayout myLL;
    	List<ActivityManager.RunningTaskInfo> lru;
    	ArrayList<String> excludeThis;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
        	d(LOG_TAG, "onCreate Anfang");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            myLL = (LinearLayout) findViewById(R.id.llImage_test);
            am = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
            excludeThis = new ArrayList<String>();
            excludeThis.add("com.felixl.aswitcher.MainActivity");
            excludeThis.add("com.fede.launcher.Launcher");
            d(LOG_TAG, excludeThis.toString());
            d(LOG_TAG, "onCreate geschafft");
        }
        
        @Override
        public void onResume(){
            	d(LOG_TAG, "onResume 0");
                super.onResume();
                myLL.removeAllViews();
                d(LOG_TAG, "onResume 1");
                // Faruq: Get running tasks
                d(LOG_TAG, am.toString());
                lru = am.getRunningTasks(8);
                d(LOG_TAG, "onResume 2");
                d(LOG_TAG, lru.toString());
                for (int i = 0; i < lru.size() && myLL.getChildCount() < 5; i++){//ActivityManager.RunningTaskInfo rti : lru) {
                	// Faruq: This will print out the last tasks Class Names
                	d(LOG_TAG, "onResume 2.5");
                	ActivityManager.RunningTaskInfo rti = lru.get(i);
                	String rtiName = rti.topActivity.getClassName();
                	d(LOG_TAG, "LRU: "+ rtiName);
                	
                	if (!excludeThis.contains(rtiName)){
                		// Faruq: The code that requires magic modifications
                		Bitmap b = rti.thumbnail;
                		if (b != null) {
                			d(LOG_TAG, "	Bitmap found: "+b);
                			// Faruq: Create ImageView object and set the content to the bitmap
                			ImageView iv = new ImageView(this);
                			ViewGroup.MarginLayoutParams mlp = new ViewGroup.MarginLayoutParams(b.getWidth(), b.getHeight());
                			mlp.setMargins(10, 10, 10, 10);
                			iv.setLayoutParams(mlp);
                			iv.setImageBitmap(b);
                			iv.setId(i);
                			iv.setOnClickListener(myClickListener);
                			
                			// Faruq: Add the iv to the Layout we have
                			myLL.addView(iv);
                		}
                		else {
                			d(LOG_TAG, "	Bitmap is null");
                		}
                	}
                    d(LOG_TAG, "onResume 3");
                }
        }
        
        OnClickListener myClickListener = new OnClickListener() {
        	@Override
        	public void onClick(View v) {
        		ActivityManager.RunningTaskInfo clickedRti = lru.get(v.getId());
        		Intent i = new Intent(Intent.ACTION_MAIN); i.setComponent(clickedRti.baseActivity);
        		i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT).addCategory(Intent.CATEGORY_LAUNCHER);
        	    startActivity(i);
        	}
        };
    }
    Ach ja, Bitmap b = rti.thumbnail ist 320 * 320 Pixel groß.
    Und entschuldigt bitte die Unordnung :D
     
  2. BenOtto, 26.09.2010 #2
    BenOtto

    BenOtto Android-Hilfe.de Mitglied

    Beiträge:
    141
    Erhaltene Danke:
    15
    Registriert seit:
    30.08.2010
    Hast du mal debuggt? Step mal durch und guck nach wo der Fehler auftritt, dann findet man die Lösung leichter.
     
  3. FelixL, 26.09.2010 #3
    FelixL

    FelixL Threadstarter Ehrenmitglied

    Beiträge:
    4,855
    Erhaltene Danke:
    754
    Registriert seit:
    26.11.2009
    Phone:
    Wileyfox Swift, HTC One M8
    Äm ja, ich habe debuggt, siehe oben, der Fehler tritt auf in
    lru = am.getRunningTasks(8);

    Ich glaube ich verstehe das Problem im Moment ganz gut, sehe aber keine für mich zufriedenstellende Lösung dafür.
    In dem Moment wo ich die RunningTaskInfos abfrage, werden sie von einem Prozess zum anderen übertragen. Durch eine Veränderung des Systems selbst im Costum-Rom das ich benutze werden die RunningTaskInfo.thumbnails erst abrufbar, aber eben dabei auch mit übertragen. Ist wohl leider unumgänglich, da ich sie ja in meinem Prozess benutzen will.
    Problem dabei:
    [android-developers] JavaBinder: !!! FAILED BINDER TRANSACTION !!! - sandy8531 - com.googlegroups.android-developers - MarkMail
    Die Größe der zwischen Prozessen übertragenen Daten ist limitiert und wird von mir überschritten. Interessanterweise funktioniert ab diesem Moment auch das Home-Long-Press-Menü nicht mehr, das benutzt anscheinend den selben Befehl, auch wenn die Fehlermeldung nicht erscheint.

    Möglichkeiten für mich:
    -Bildgröße reduzieren
    Verschlechtert die Qualität, funktioniert aber am wahrscheinlichsten. Ich könnte grob gerechnet vier mal so viele Bilder übertragen wenn ich die Größe von 320*320 auf 160*160 reduziere.
    -Limit in der Übertragung erhöhen
    Wahrscheinlich nicht möglich oder großer Aufwand, kann Nebenwirkungen haben.
    -Service einbauen, der jedesmal beim Schließen einer App ihr Bild abgreift, damit mache ich aber das original Long-Press-Home-Menü unbrauchbar, weil der Fehler dort immernoch auftritt.

    Bleibt wohl nur die erste Möglichkeit, außer es fällt noch jemandem was ein.
     

Diese Seite empfehlen