2017-08-26 1 views
1

Die Frage ist im Grunde die des Titels selbst, aber es folgt eine Kontextualisierung.Verschiedene Instanzen derselben AsyncTask teilen lokale Variablen?

Ich entwickle eine Android-App mit der Vuforia-Bibliothek. Diese Anwendung nimmt in jedem Frame den Frame von der Kamera und löst zusammen mit anderen Informationen eine AsyncTask aus. Der Zweck von AsyncTask besteht darin, diese anderen Informationen zu verwenden und ein Teil des Bildes aus dem Bild zu extrahieren, das immer der gleichen Region meiner realen Welt entspricht (die Magie hinter diesem Teil beruht auf der Vuforia-Bibliothek und funktioniert einwandfrei). Da die Berechnungen dahinter zeitraubend sind, endet die Aufgabe nicht vor dem nächsten Frame, sodass mehrere AsyncTask gleichzeitig ausgeführt werden, wobei jeder in einem anderen Frame startet. Bei meinen Tests habe ich festgestellt, dass diese extrahierten Bildteile zueinander versetzt sind, was mich zu der Annahme brachte, dass die verschiedenen AsyncTasks-Instanzen, die ich in jedem Frame ausführe, möglicherweise Informationen von den lokalen Variablen teilen. Diese Informationen werden lokalen Variablen über den AsyncTask-Konstruktor zugewiesen.

Also würde ich gerne wissen, ob es für die Aufgaben möglich wäre, Informationen zu teilen, und wenn ja, wie könnte ich das verhindern?

Aktualisierung mit Konstruktorcode von AsyncTask:

GetData ist eine innere Klasse.

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){...} 

} 

ich den Code nicht von doInBackground Methode kopiert, weil es zu groß und ich denke, dass es für die Frage Zweck nicht notwendig ist.

Und in jedem Frame ein Anruf der Aufgabe:,

//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); 
    } 

Die Variablen Ich will nicht sind geteilt werden ‚Bild‘ und ‚Pose‘

+0

Lokale Instanzvariablen können nicht gemeinsam genutzt werden.Wenn sie im Konstruktor sind, haben Sie sie tatsächlich zu statischen Membervariablen gemacht? Können Sie Ihren Code zeigen? –

+0

Nein, sie sind keine statischen Variablen. Ich aktualisierte meine Frage mit dem Konstruktorcode. Und meine AsyncTask ist eine innere Klasse, macht es einen Unterschied? –

Antwort

0

Wenn Sie ihnen die gleichen Referenzen kamen sie würde Daten teilen. Zum Beispiel, wenn Sie hatten

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

Dann Task 1 und 2 teilen beide myData. Die Lösung besteht darin, eine Kopie der Liste zu erstellen (beachten Sie, dass Sie, falls die Liste Objekte enthält, je nach Bedarf eine tiefe Kopie erstellen muss).

Lokale Variablen (Variablen B. in der doInBacground-Funktion deklariert) werden nicht gemeinsam genutzt und jede hat bereits ihre eigene Kopie

Verwandte Themen