我正在尝试构建一个获取空位图的ane。
bitmapData = new BitmapData(size.width,size.height,false, 0x00000000);
获取它,在不同的线程中编辑字节缓冲区,然后释放它。
这是 java 部分中的调用函数代码
public FREObject call(FREContext freContext, FREObject[] args) {
try {
FREBitmapData bitmapData = (FREBitmapData)args[0];
bitmapData.acquire();
ByteBuffer bytebuffer =
myTaskProcessingQueue.put(new Task(freContext,bitmapData,bytebuffer)); //edit the bitmap data in a specific thread
} catch (InterruptedException e) {
Log.e(TAG, "exception", e);
} catch (FREInvalidObjectException e) {
Log.e(TAG, "exception", e);
} catch (FREWrongThreadException e) {
Log.e(TAG, "exception", e);
}
return null;
}
当我完成字节缓冲区时:
new Handler(Looper.getMainLooper()).post(new Runnable () {
@Override
public void run () {
try {
Toast.makeText(task.context.getActivity(),"Toast",Toast.LENGTH_SHORT).show();
task.bitmapData.release();
} catch (FREInvalidObjectException e) {
Log.e("InitExtractorFunction", "FREInvalidObjectException", e);
} catch (FREWrongThreadException e) {
Log.e(TAG, "exception", e);
}
}
});
toast 指令工作正常,但是 bitmapData.release(( 即使我在主线程上,也会抛出 FREWrongThreadException,并且在 Adobe 网站上找不到有关此异常的任何文档。
知道吗?
编辑:
以下是我正在编辑数据的线程类的更多代码:
private class MyTaskWorker extends Thread {
@Override
public void run() {
while (true) {
try {
processMyTask(myTaskProcessingQueue.take());
} catch (InterruptedException e) {
Log.e(TAG,"InterruptedException", e);
}
}
}
private void processMyTask(Task task) {
// do work with bytebuffer
new Handler(Looper.getMainLooper()).post(new Runnable () {
@Override
public void run () {
try {
Log.d(TAG, "Thread: " + Thread.currentThread().getName());
Toast.makeText(task.context.getActivity(),"Toast",Toast.LENGTH_SHORT).show();
task.bitmapData.release();
Log.i(TAG,"bitmap released");
} catch (FREInvalidObjectException e) {
Log.e(TAG, "FREInvalidObjectException", e);
} catch (FREWrongThreadException e) {
Log.e(TAG,"FREWrongThreadException", e);
}
}
});
}
}
编辑 2 :
我还尝试在同一个后台线程中进行获取和释放,但仍然没有骰子。我设法让它工作的唯一方法是当我在调用函数中同时执行获取和释放时,但我不想阻止主线程等待位图修改......
就像常规多线程一样,每当您acquire
锁时,它都必须由锁定它的同一线程释放。
此异常的文档具有以下说明:
FRE_WRONG_THREAD 该方法是从运行时对本机扩展函数具有未完成调用的线程以外的线程调用的。
因此,当从后台线程调用call()
时,后台线程是锁定bitmapData
线程,这意味着主线程不拥有锁以稍后释放它。
您始终可以通过在每个位置记录线程名称来测试这一点:
Log.d(..., "Thread: " + Thread.currentThread().getName());
解决方案是确保从与call()
相同的位置(线程(调用release()
方法(无论位置如何(