Failed Binder Transaction

FelixL

FelixL

Ehrenmitglied
821
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
 
Hast du mal debuggt? Step mal durch und guck nach wo der Fehler auftritt, dann findet man die Lösung leichter.
 
Ä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.
 

Ähnliche Themen

E
Antworten
2
Aufrufe
775
ekaya999
E
A
Antworten
5
Aufrufe
971
jogimuc
J
znieh99
  • znieh99
Antworten
1
Aufrufe
1.152
znieh99
znieh99
Zurück
Oben Unten