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‘
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? –
Nein, sie sind keine statischen Variablen. Ich aktualisierte meine Frage mit dem Konstruktorcode. Und meine AsyncTask ist eine innere Klasse, macht es einen Unterschied? –