web-dev-qa-db-fra.com

Android Java binder FAILED BINDER TRANSACTION?

J'essaie de télécharger une image du service et de l'afficher en activité mais je continue à

 Java binder FAILED BINDER TRANSACTION

Ceci est mon code de service

public class DownloadImageService extends Service {

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    new LoadImageAsync().execute(intent.getStringExtra("type"));
    return Service.START_NOT_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

private class LoadImageAsync extends AsyncTask<String, Void, String> {
    byte[] compressedImage;
    Bitmap bmp;
    String img;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {

        try {
            URL url = new URL(imgUrl);
            bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            compressedImage = CompressBitmap.compresssImage(bmp);
            img = Base64.encodeToString(compressedImage, Base64.DEFAULT);

        } catch (IOException e) {
            compressedImage = null;
            bmp = null;
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        if (compressedImage != null) {
            Intent i = new Intent(getApplicationContext(), OtherCampaignActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            i.putExtra("image_byte", img);
            startActivity(i);
        }
        stopService(new Intent(getApplicationContext(), DownloadImageService.class));
    }
}

}

Fonction de compression

public static byte[] compresssImage(Bitmap b) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    b.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] compressedByteArray = stream.toByteArray();
    return compressedByteArray;
}

Mon activité

public class OtherActivity extends AppCompatActivity {
private ImageView iv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_other);
    iv = (ImageView) findViewById(R.id.imageViewCam);
    byte[] byteArray =      Base64.decode(getIntent().getStringExtra("image_byte"), Base64.DEFAULT);
    //        byte[] byteArray = getIntent().getExtras().getByteArray("image_byte");
    Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    iv.setImageBitmap(bitmap);

}

@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}
}

Quel est le problème dans le code. L'activité ne démarre pas.

l'application ne plante pas. Je ne reçois cela que dans logcat:

06-30 12:38:36.800 29992-29992/com.vt.enit E/JavaBinder﹕ !!! FAILED BINDER TRANSACTION !!!

C'est probablement dû à un grand bitmap je suppose.

17
WISHY

La création du cache de l'image résout mon problème

private LruCache<String, Bitmap> mMemoryCache;

@Override
protected void onCreate(Bundle savedInstanceState) {
...
// Get max available VM memory, exceeding this amount will throw an
// OutOfMemory exception. Stored in kilobytes as LruCache takes an
// int in its constructor.
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

// Use 1/8th of the available memory for this memory cache.
final int cacheSize = maxMemory / 8;

mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
    @Override
    protected int sizeOf(String key, Bitmap bitmap) {
        // The cache size will be measured in kilobytes rather than
        // number of items.
        return bitmap.getByteCount() / 1024;
    }
};
...
}

public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemCache(key) == null) {
    mMemoryCache.put(key, bitmap);
}
 }

public Bitmap getBitmapFromMemCache(String key) {
return mMemoryCache.get(key);
}

Référence: Caching Bitmaps

12
WISHY

Il échoue car vous essayez d'envoyer une image en tant qu'intention supplémentaire et elle est trop grande pour cela. Vous ne pouvez pas envoyer d'image en utilisant IPC techniques de communication comme les intentions ou le service/classeur, il y a une limite de 1 Mo/10 Mo selon la version d'Android.

7
Yuriy