2017-08-26 73 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函數中聲明)不共享,並且每個都將擁有自己的副本

相關問題