C
CoffeeCode
Ambitioniertes Mitglied
- 2
Ich muss für eine Bitmap mit dem Befehel Allocation Speicher reservieren um dieses Bitmap mit renderscript verarbeiten zu können.
Diese Bitmap wird über einene BitmapRegionDecoder erzeigt da das Bild zu groß ist um als eines in den speicher geladen zu werden.
Allerdings bekomme ich eine NullPointerException.
Mit einer "normal" geladenen Bitmap funktioniert dies tadelos.
Ich vermute das das Problem beim AsyncTask oder bei den WeakReference liegt.
Jedoch wurde das Decoder Objekt schon zu einem Normalen Object umgewandelt.
Normalerweise wird die Bitmap direkt mit return zurückgegeben und dann im ImageView gezeichnet (das funktioniert auch). Ich möchte die bitmap bevor sie gezeichnet wird filtern.
W/System.err java.lang.NullPointerException
Diese Bitmap wird über einene BitmapRegionDecoder erzeigt da das Bild zu groß ist um als eines in den speicher geladen zu werden.
Allerdings bekomme ich eine NullPointerException.
Mit einer "normal" geladenen Bitmap funktioniert dies tadelos.
Ich vermute das das Problem beim AsyncTask oder bei den WeakReference liegt.
Jedoch wurde das Decoder Objekt schon zu einem Normalen Object umgewandelt.
Normalerweise wird die Bitmap direkt mit return zurückgegeben und dann im ImageView gezeichnet (das funktioniert auch). Ich möchte die bitmap bevor sie gezeichnet wird filtern.
Code:
private class BitmapTileTask extends AsyncTask<Void, Void, Bitmap> {
private final WeakReference<SubsamplingScaleImageView> viewRef;
private final WeakReference<BitmapRegionDecoder> decoderRef;
private final WeakReference<Tile> tileRef;
public BitmapTileTask(SubsamplingScaleImageView view, BitmapRegionDecoder decoder, Tile tile) {
this.viewRef = new WeakReference<SubsamplingScaleImageView>(view);
this.decoderRef = new WeakReference<BitmapRegionDecoder>(decoder);
this.tileRef = new WeakReference<Tile>(tile);
tile.loading = true;
}
@Override
protected Bitmap doInBackground(Void... params) {
try {
if (decoderRef != null && tileRef != null && viewRef != null) {
final BitmapRegionDecoder decoder = decoderRef.get();
final Tile tile = tileRef.get();
if (decoder != null && tile != null && !decoder.isRecycled()) {
synchronized (decoder) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = tile.sampleSize;
options.inPreferredConfig = Config.RGB_565;
Bitmap tileBitmap = decoder.decodeRegion(tile.sRect, options);
Allocation bitmapAlloc = Allocation.createFromBitmap(renderScript, tileBitmap); //java.lang.NullPointerException
//do some renderscripting with this bitmap
return renderScriptedBitmap;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (viewRef != null && tileRef != null && bitmap != null) {
final SubsamplingScaleImageView subsamplingScaleImageView = viewRef.get();
final Tile tile = tileRef.get();
if (subsamplingScaleImageView != null && tile != null) {
tile.bitmap = bitmap;
tile.loading = false;
subsamplingScaleImageView.onTileLoaded();
}
}
}
}
W/System.err java.lang.NullPointerException
Code:
W/System.err at android.renderscript.Allocation.createFromBitmap(Allocation.java:1586)
W/System.err at com.ap.wificam.SubsamplingScaleImageView.SubsamplingScaleImageView$BitmapTileTask.doInBackground(SubsamplingScaleImageView.jaW/System.err at com.ap.wificam.SubsamplingScaleImageView.SubsamplingScaleImageView$BitmapTileTask.doInBackground(SubsamplingScaleImageView.java:656)
W/System.err at android.os.AsyncTask$2.call(AsyncTask.java:288)
W/System.err at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
W/System.err at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err at java.lang.Thread.run(Thread.java:841)