2017-08-26 3 views
1

基本的に質問はタイトル自体の質問ですが、文脈に沿っています。同じAsyncTaskの異なるインスタンスがローカル変数を共有していますか?

私は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); 
    } 

私が共有することはしたくない変数が「画像」であり、あなたは彼らに同じ参照番号を渡した場合

+0

ローカルインスタンス変数は共有できません。コンストラクタ内にある場合は、実際に静的メンバー変数にしましたか?たとえば、doInBacground関数内で宣言されている変数は共有されていません。 –

+0

いいえ、静的変数ではありません。私の質問はコンストラクタコードで更新しました。私のAsyncTaskは内部クラスですが、違いはありますか? –

答えて

0

「をもたらす」、彼らはデータを共有します。例えば、持っていた場合

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

次に、タスク1と2は両方ともmyDataを共有します。これを修正する方法は、リストをコピーすることです(リストにオブジェクトがある場合は、必要に応じて各値をコピーする必要があります)。

ローカル変数

関連する問題