gpt4 book ai didi

java - 需要有关同步的帮助

转载 作者:行者123 更新时间:2023-12-01 15:49:23 24 4
gpt4 key购买 nike

我正在创建一个直播应用程序,但我陷入了某个点。所以,这是我的代码:

public synchronized byte[] getPicture(int Width, int Height) {
FrameWidth = Width;
FrameHeight = Height;

try {
while (!isPreviewOn) {
wait();
}

isDecoding = true;
mAvailableFrame = false;

c.setOneShotPreviewCallback(mPreviewCallback);

while (isDecoding) {
wait();
}

}
catch (Exception e) {
return null;
}

mAvailableFrame = false;

return mCurrentFrame;
}

PreviewCallback mPreviewCallback = new PreviewCallback() {

@Override
public synchronized void onPreviewFrame(byte[] data, Camera camera) {
int width = FrameWidth;
int height = FrameHeight;

// API 7
int[] temp = new int[width*height];
OutputStream out = new ByteArrayOutputStream();
Bitmap bm = null;

raw2jpg(temp, data, width, height);
bm = Bitmap.createBitmap(temp, width, height, Bitmap.Config.RGB_565);
bm.compress(CompressFormat.JPEG, 100, out);
/*ref*/mCurrentFrame = ((ByteArrayOutputStream)out).toByteArray();
mAvailableFrame = true;
isDecoding = false;
notify();
}
};

当同步 getPicture() 被调用时,当它正在执行时,没有其他线程可以调用该实例上的同步方法。当 getPicture() 等待 isDecoding 时,它会持有实例的锁。我怀疑 setOneShotPreviewCallback() 正在执行,并且相机正在尝试在自己的线程上调用 onPreviewFrame() ,但由于这也是一个同步方法,它会阻塞等待 getPicture() 终止,但它不能终止,因为它需要回调清除正在解码。看起来陷入了僵局。

它无法调用 onPreviewFrame,因为对象实例已锁定,因此相机线程被阻止等待 getPicture() 完成。

我说得对吗?我应该如何解决这个问题?所以我必须再次通知OnPreviewFrame IsDecoding = false

非常感谢任何帮助。

也投票支持,我将给予赏金;)

最佳答案

mPreviewCallback.onPreviewFrame() 中的notify() 通知mPreviewCallback 对象监视器,而getPicture() 中的wait() 等待另一个对象监视器-notify 永远不会释放wait()。您应该定义一个可从两个对象访问的(最终)变量,并对该变量显式调用 wait() 和 notification()。像这样的事情:

public final Object myMonitor = new Object();

public synchronized byte[] getPicture(int Width, int Height) {
FrameWidth = Width;
FrameHeight = Height;

try {
synchronized(myMonitor) {
while (!isPreviewOn) {
myMonitor.wait();
}
}
isDecoding = true;
mAvailableFrame = false;

c.setOneShotPreviewCallback(mPreviewCallback);

synchronized(myMonitor) {
while (isDecoding) {
myMonitor.wait();
}
}
}
catch (Exception e) {
return null;
}

mAvailableFrame = false;

return mCurrentFrame;
}

PreviewCallback mPreviewCallback = new PreviewCallback() {

@Override
public synchronized void onPreviewFrame(byte[] data, Camera camera) {
int width = FrameWidth;
int height = FrameHeight;

// API 7
int[] temp = new int[width*height];
OutputStream out = new ByteArrayOutputStream();
Bitmap bm = null;

raw2jpg(temp, data, width, height);
bm = Bitmap.createBitmap(temp, width, height, Bitmap.Config.RGB_565);
bm.compress(CompressFormat.JPEG, 100, out);
/*ref*/mCurrentFrame = ((ByteArrayOutputStream)out).toByteArray();
mAvailableFrame = true;
isDecoding = false;
synchronized(myMonitor) {
myMonitor.notify();
}
}
};

我不知道您正在扩展的 API,但在此更改后可能不需要同步进程。另外,还不清楚是谁设置了 isPreviewOn。

关于java - 需要有关同步的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6425783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com