【问题标题】:Different instances of same AsyncTask share local variables?同一个 AsyncTask 的不同实例共享局部变量?
【发布时间】:2017-08-26 00:01:23
【问题描述】:

基本上问题在于标题本身,但它遵循上下文。

我正在使用 Vuforia 库开发一个 Android 应用。此应用程序在每一帧中从相机中获取帧,并与其他信息一起触发 AsyncTask。 AsyncTask 的目的是使用这些其他信息并从框架中提取始终对应于我的现实世界的同一区域的图像(这部分背后的魔力是由于 Vuforia 库并且工作正常)。由于这背后的计算非常耗时,因此任务不会在下一帧之前结束,因此多个 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'

【问题讨论】:

  • 本地实例变量不能共享。如果它们在构造函数中,您实际上是否将它们设为静态成员变量?你能展示你的代码吗?
  • 不,它们不是静态变量。我用构造函数代码更新了我的问题。而且我的 AsyncTask 是一个内部类,有什么区别吗?

标签: android android-asynctask vuforia


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-19
    • 2022-07-12
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多