2012-08-09 42 views
5

我正在构建Android应用程序,我希望在调用活动继续之前等待PictureCallback发生。在等待PictureCallback发生时“暂停”活动

import android.hardware.Camera; 

private Camera camera 
private Bitmap picture; 

camera.takePicture(null, null, new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize = 1; 
    picture = BitmapFactory.decodeByteArray(data , 0, data.length, options); 
    } 
} 

... do some other logic with picture 

我想保持分隔的其他逻辑,因此我想避免在takePicture函数编码此。

可以做到这一点吗?

+0

我正在尝试完全相同。好问题。 – 2013-07-04 14:09:18

回答

0

在做任何后台工作时阻止UI线程是不好的做法。

如果您调用内置的相机活动,您的活动将在后台。拍完照片并关闭相机后,当您回到活动状态时,照片将被保存。

如果您使用自己的Camera实现,那么你应该显示一个ProgressDialog,如果你有任何后台工作要做,你应该在一个单独的线程。

+0

我确实使用我自己的Camera实现。我看不到如何使用ProgressDialog可以解决这个问题。 执行代码的方法是如下: 1)拍照 2)做下一个逻辑 3)回调返回图片 我想它的顺序如下:1 3 2 – Gillain 2012-08-09 14:18:33

+1

我误解你的问题看起来是这样的。但是,你可以用一个单独的方法编写你的2),并在回调函数结束时调用它。 – 2012-08-09 14:19:59

+0

感谢您的快速回复。你的建议可能是一个解决方案,但我遇到这么多麻烦的原因是因为我试图让我的代码尽可能抽象。 在我的项目中,我有一个活动和一个分离的相机类。我在Camera类中调用takePicture函数,然后必须等待回调,然后将图片返回到活动。问题在于,在调用takePicture之后的活动中的代码会在回调有机会返回位图之前执行。 告诉我,如果你想看完整的代码。 – Gillain 2012-08-09 15:40:54

0

你可以在两个线程中实现它。然后在当前线程上调用PictureCallback之后调用wait()。然后,当PictureCallback完成时,它会调用notify()让等待的线程知道它完成。但是你不想阻止你的主线程。你可以,如果你想/需要,但它不是一个好主意。

+0

我试图在不同的线程中实现PictureCallback,但那并没有解决。不知何故回调总是在主线程中运行。 – Gillain 2012-08-09 14:14:33