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

时间:2017-08-26 00:01:24

标签: android android-asynctask vuforia

基本上问题是标题本身的问题,但它遵循语境化。

我正在使用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'

1 个答案:

答案 0 :(得分:0)

如果您传递相同的引用,它们将共享数据。例如,如果你有

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

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

本地变量(例如在doInBacground函数中声明的变量)不会被共享,并且每个变量都已经拥有自己的副本。

相关问题