基本上问题是标题本身的问题,但它遵循语境化。
我正在使用Vuforia库开发Android应用。此应用程序在每个帧中从相机获取帧,并与其他信息一起触发AsyncTask。 AsyncTask的目的是使用这些其他信息,并从框架中提取一个始终对应于我现实世界的相同区域的图像(此部分背后的魔力是由于Vuforia库并且正常工作)。由于这背后的计算是耗时的,因此任务不会在下一帧之前结束,因此多个AsyncTask同时运行,每个AsyncTask都在不同的帧中开始。根据我的测试,我注意到这些提取的图像彼此偏移,这使我认为我在每个帧中执行的不同AsyncTasks实例可能正在共享来自局部变量的信息。此信息通过AsyncTask构造函数分配给局部变量。
所以我想知道这些任务是否可以共享信息,如果可以,我怎么能阻止这个呢?
使用AsyncTask的构造函数代码进行更新:
GetData是一个内部类。
private class GetData extends AsyncTask<Matrix34F, Void, Void>{
SampleAppRenderer mRenderer;
float surfaceH, surfaceW, scaleSF;
int imageW, imageH, screenW, screenH, stride;
short[] pixels;
public GetData(SampleAppRenderer mRenderer, float surfaceH, float surfaceW, Image image){
super();
this.mRenderer = mRenderer;
this.surfaceH = surfaceH;
this.surfaceW = surfaceW;
this.imageW = image.getWidth();
this.imageH = image.getHeight();
Vec2I screenDim = mRenderer.getDimensions();
this.screenW = screenDim.getData()[0];
this.screenH = screenDim.getData()[1];
ByteBuffer bb = image.getPixels();
pixels = new short[bb.remaining()/2];
bb.order(ByteOrder.BIG_ENDIAN).asShortBuffer().get(pixels);
this.stride = image.getStride();
this.scaleSF = (float)screenH/imageW;
}
@Override
protected Void doInBackground( Matrix34F... pose){...}
}
我没有复制doInBackground方法的代码,因为它太大了,我认为这不是问题所必需的。
在每一帧中调用任务:
//Vuforia's methods to get frame and pose of camera
Frame frame = state.getFrame();
Matrix34F pose = trackableResult.getPose();
for(int i = 0; i < frame.getNumImages(); ++i){
Image image = frame.getImage(i);
GetData ATinstance = new GetData(mSampleAppRenderer, surfaceHeight, surfaceWidth, image);
ATinstance.execute(pose);
}
我不想分享的变量是'image'和'pose'
答案 0 :(得分:0)
如果您传递相同的引用,它们将共享数据。例如,如果你有
List myData;
task1 = new AyncTaskClass(myData);
task2 = new AyncTaskClass(myData);
然后任务1和2将共享myData。修复它的方法是复制列表(请注意,如果列表包含对象,您可能需要根据需要进行深层复制(复制其中的每个值)。
本地变量(例如在doInBacground函数中声明的变量)不会被共享,并且每个变量都已经拥有自己的副本。