相同 AsyncTask 的不同实例共享局部变量?

Different instances of same AsyncTask share local variables?

基本上问题是标题本身的问题,但它遵循上下文。

我正在使用 Vuforia 库开发 Android 应用程序。此应用程序在每一帧中从相机获取帧,并与其他信息一起触发 AsyncTask。 AsyncTask 的目的是使用这些其他信息,并从帧中提取始终对应于我现实世界的同一区域的图像片段(这部分背后的魔力是由于 Vuforia 库,并且工作正常)。由于这背后的计算是 time-consuming,任务不会在下一帧之前结束,因此同时有多个 AsyncTask 运行,每个都从不同的帧开始。从我的测试中,我注意到这些提取的图像片段彼此偏移,这让我认为我在每一帧中执行的不同 AsyncTasks 实例可能正在共享来自局部变量的信息。此信息通过 AsyncTask 构造函数分配给局部变量。

所以我想知道任务是否有可能共享信息,如果可以,我该如何防止这种情况?

更新AsyncTask的构造函数代码:

GetData 是一个内部 class.

    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'

如果您向他们传递相同的引用,他们就会共享数据。例如,如果您有

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

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

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