facebook / fresco

An Android library for managing images and the memory they use.
https://frescolib.org/
MIT License
17.07k stars 3.75k forks source link

Issue when use imagepipeline dataSource.subscribe to save image on sdcard #834

Closed xifan-xf closed 8 years ago

xifan-xf commented 8 years ago
java.lang.ExceptionInInitializerError
    at com.android.ui.ImageBrowserActivity$1$2.onNewResultImpl(ImageBrowserActivity.java:177)
    at com.facebook.datasource.BaseDataSubscriber.onNewResult(BaseDataSubscriber.java:43)
    at com.facebook.datasource.AbstractDataSource$1.run(AbstractDataSource.java:181)
    at com.facebook.common.executors.CallerThreadExecutor.execute(CallerThreadExecutor.java:49)
    at com.facebook.datasource.AbstractDataSource.notifyDataSubscriber(AbstractDataSource.java:172)
    at com.facebook.datasource.AbstractDataSource.notifyDataSubscribers(AbstractDataSource.java:163)
    at com.facebook.datasource.AbstractDataSource.setResult(AbstractDataSource.java:215)
    at com.facebook.imagepipeline.datasource.AbstractProducerToDataSourceAdapter.onNewResultImpl(AbstractProducerToDataSourceAdapter.java:73)
    at com.facebook.imagepipeline.datasource.CloseableProducerToDataSourceAdapter.onNewResultImpl(CloseableProducerToDataSourceAdapter.java:58)
    at com.facebook.imagepipeline.datasource.CloseableProducerToDataSourceAdapter.onNewResultImpl(CloseableProducerToDataSourceAdapter.java:26)
    at com.facebook.imagepipeline.datasource.AbstractProducerToDataSourceAdapter$1.onNewResultImpl(AbstractProducerToDataSourceAdapter.java:52)
    at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:49)
    at com.facebook.imagepipeline.producers.RemoveImageTransformMetaDataProducer$RemoveImageTransformMetaDataConsumer.onNewResultImpl(RemoveImageTransformMetaDataProducer.java:53)
    at com.facebook.imagepipeline.producers.RemoveImageTransformMetaDataProducer$RemoveImageTransformMetaDataConsumer.onNewResultImpl(RemoveImageTransformMetaDataProducer.java:38)
    at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:49)
    at com.facebook.imagepipeline.producers.ResizeAndRotateProducer$TransformingConsumer.onNewResultImpl(ResizeAndRotateProducer.java:131)
    at com.facebook.imagepipeline.producers.ResizeAndRotateProducer$TransformingConsumer.onNewResultImpl(ResizeAndRotateProducer.java:72)
    at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:49)
    at com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer$AddImageTransformMetaDataConsumer.onNewResultImpl(AddImageTransformMetaDataProducer.java:48)
    at com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer$AddImageTransformMetaDataConsumer.onNewResultImpl(AddImageTransformMetaDataProducer.java:32)
    at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:49)
    at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer.onNextResult(MultiplexProducer.java:442)
    at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer$ForwardingConsumer.onNewResultImpl(MultiplexProducer.java:499)
    at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer$ForwardingConsumer.onNewResultImpl(MultiplexProducer.java:496)
    at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:49)
    at com.facebook.imagepipeline.producers.EncodedMemoryCacheProducer.produceResults(EncodedMemoryCacheProducer.java:64)
    at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer.startInputProducerIfHasAttachedConsumers(MultiplexProducer.java:336)
    at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer.access$000(MultiplexProducer.java:125)
    at com.facebook.imagepipeline.producers.MultiplexProducer.produceResults(MultiplexProducer.java:87)
    at com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer.produceResults(AddImageTransformMetaDataProducer.java:29)
    at com.facebook.imagepipeline.producers.ResizeAndRotateProducer.produceResults(ResizeAndRotateProducer.java:69)
    at com.facebook.imagepipeline.producers.ThreadHandoffProducer$1.onSuccess(ThreadHandoffProducer.java:45)
    at com.facebook.common.executors.StatefulRunnable.run(StatefulRunnable.java:54)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    at com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java:43)
    at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    at android.os.Handler.<init>(Handler.java:121)
    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
    at android.os.AsyncTask.<clinit>(AsyncTask.java:190)
    ... 37 more
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    at android.os.Handler.<init>(Handler.java:121)
    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
    at android.os.AsyncTask.<clinit>(AsyncTask.java:190)
    at la.juju.android.ui.ImageBrowserActivity$1$2.onNewResultImpl(ImageBrowserActivity.java:177)
    at com.facebook.datasource.BaseDataSubscriber.onNewResult(BaseDataSubscriber.java:43)
    at com.facebook.datasource.AbstractDataSource$1.run(AbstractDataSource.java:181)
    at com.facebook.common.executors.CallerThreadExecutor.execute(CallerThreadExecutor.java:49)
    at com.facebook.datasource.AbstractDataSource.notifyDataSubscriber(AbstractDataSource.java:172)
    at com.facebook.datasource.AbstractDataSource.notifyDataSubscribers(AbstractDataSource.java:163)
    at com.facebook.datasource.AbstractDataSource.setResult(AbstractDataSource.java:215)
    at com.facebook.imagepipeline.datasource.AbstractProducerToDataSourceAdapter.onNewResultImpl(AbstractProducerToDataSourceAdapter.java:73)
    at com.facebook.imagepipeline.datasource.CloseableProducerToDataSourceAdapter.onNewResultImpl(CloseableProducerToDataSourceAdapter.java:58)
    at com.facebook.imagepipeline.datasource.CloseableProducerToDataSourceAdapter.onNewResultImpl(CloseableProducerToDataSourceAdapter.java:26)
    at com.facebook.imagepipeline.datasource.AbstractProducerToDataSourceAdapter$1.onNewResultImpl(AbstractProducerToDataSourceAdapter.java:52)
    at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:49)
    at com.facebook.imagepipeline.producers.RemoveImageTransformMetaDataProducer$RemoveImageTransformMetaDataConsumer.onNewResultImpl(RemoveImageTransformMetaDataProducer.java:53)
    at com.facebook.imagepipeline.producers.RemoveImageTransformMetaDataProducer$RemoveImageTransformMetaDataConsumer.onNewResultImpl(RemoveImageTransformMetaDataProducer.java:38)
    at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:49)
    at com.facebook.imagepipeline.producers.ResizeAndRotateProducer$TransformingConsumer.onNewResultImpl(ResizeAndRotateProducer.java:131)
    at com.facebook.imagepipeline.producers.ResizeAndRotateProducer$TransformingConsumer.onNewResultImpl(ResizeAndRotateProducer.java:72)
    at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:49)
    at com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer$AddImageTransformMetaDataConsumer.onNewResultImpl(AddImageTransformMetaDataProducer.java:48)
    at com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer$AddImageTransformMetaDataConsumer.onNewResultImpl(AddImageTransformMetaDataProducer.java:32)
    at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:49)
    at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer.onNextResult(MultiplexProducer.java:442)
    at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer$ForwardingConsumer.onNewResultImpl(MultiplexProducer.java:499)
    at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer$ForwardingConsumer.onNewResultImpl(MultiplexProducer.java:496)
    at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:49)
    at com.facebook.imagepipeline.producers.EncodedMemoryCacheProducer.produceResults(EncodedMemoryCacheProducer.java:64)
    at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer.startInputProducerIfHasAttachedConsumers(MultiplexProducer.java:336)
    at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer.access$000(MultiplexProducer.java:125)
    at com.facebook.imagepipeline.producers.MultiplexProducer.produceResults(MultiplexProducer.java:87)
    at com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer.produceResults(AddImageTransformMetaDataProducer.java:29)
    at com.facebook.imagepipeline.producers.ResizeAndRotateProducer.produceResults(ResizeAndRotateProducer.java:69)
    at com.facebook.imagepipeline.producers.ThreadHandoffProducer$1.onSuccess(ThreadHandoffProducer.java:45)
    at com.facebook.common.executors.StatefulRunnable.run(StatefulRunnable.java:54)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    at com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java:43)
    at java.lang.Thread.run(Thread.java:856)

my code:


  CallerThreadExecutor ct = CallerThreadExecutor.getInstance();
  ct.execute(new Runnable() {
    @Override
    public void run () {
      ToastUtil.show(ImageBrowserActivity.this, "save success", ToastUtil.LENGTH_SHORT);
    }
  });
  final String url = mPhotos.get(mSvpPager.getCurrentItem());
  ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url)).build();
  ImagePipeline imagePipeline = Fresco.getImagePipeline();
  DataSource<CloseableReference<PooledByteBuffer>>
      dataSource = imagePipeline.fetchEncodedImage(imageRequest, null);
  dataSource.subscribe(new BaseDataSubscriber<CloseableReference<PooledByteBuffer>>() {
    @Override
    protected void onNewResultImpl
    (DataSource < CloseableReference < PooledByteBuffer >> dataSource) {
    try {
      bytes = dataSource.getResult();
      if (bytes != null) {
        PooledByteBuffer pooledByteBuffer = bytes.get();
        PooledByteBufferInputStream sourceIs = new PooledByteBufferInputStream(pooledByteBuffer);
        BufferedInputStream bis = new BufferedInputStream(sourceIs);
        File f = null;
        try {
          f = ImageDownload.createImageFile(url);
          FileOutputStream fos = new FileOutputStream(f);
          byte[] buffer = new byte[1024];
          int bufferLength = 0;
          while ((bufferLength = bis.read(buffer)) > 0) {
            fos.write(buffer, 0, bufferLength);
          }
          bis.close();
          fos.close();
        } catch (Exception e) {
          e.printStackTrace();
        }
        final Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        final Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        ImageBrowserActivity.this.sendBroadcast(mediaScanIntent);
      }
    } finally {
      dataSource.close();
      CloseableReference.closeSafely(bytes);
    }
  }

    @Override
    protected void onFailureImpl (DataSource < CloseableReference < PooledByteBuffer >> dataSource)
    {

    }
  }

  ,ct);
michalgr commented 8 years ago

I assume that the pasted code is part of the ImageBrowserActivity ? So which exactly is the line number 177 ?

xifan-xf commented 8 years ago

line number 177:

 PooledByteBufferInputStream sourceIs = new PooledByteBufferInputStream(pooledByteBuffer);
tyronen commented 8 years ago

The subscriber should not be assumed to be running on the UI thread. This error happens when you try to touch UI elements from a non-UI thread.