2017-08-26 106 views
1

基本上问题是标题本身的问题,但它遵循语境化。同一个AsyncTask的不同实例共享局部变量?

我正在开发一个使用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); 
    } 

我不想共享的变量是“形象”和“姿态”

+0

本地实例变量不能共享如果它们在构造函数中,是否真的使它们成为静态成员变量?你可以显示你的代码吗? –

+0

不,它们不是静态变量。我用构造函数代码更新了我的问题。我的AsyncTask是一个内部类,它有什么区别吗? –

回答

0

如果你通过他们同样的引用,他们将共享数据。例如,如果您有

List myData; 
task1 = new AyncTaskClass(myData); 
task2 = new AyncTaskClass(myData); 

然后任务1和2将共享myData。修复它的方法是复制清单(注意,如果列表中包含对象,则可能需要根据需要进行深层复制(复制每个值)。

局部变量(变量例如,在doInBacground函数中声明)不共享,并且每个都将拥有自己的副本

相关问题