Muss ich statische Objekte kopieren müssen, wenn ich sie von einer AsyncTask zugreifen möchten?

StackOverflow https://stackoverflow.com/questions/4079556

  •  28-09-2019
  •  | 
  •  

Frage

Ich habe ein Projekt, dass Anwendungen AsyncTask Arbeit im Hintergrund getan.
Dieses Projekt verwendet auch eine Klasse als Oberhalter für statische Werte wie Datenbankschlüssel, sondern auch für einen oder zwei nützliche Gegenstände für das gesamte Projekt. Sagen wir diese Klasse public class Constants genannt.

Ich möchte den Zugriff auf eines dieser Objekte von einem AsyncTask, und ich weiß nicht, ob ich es kopieren müssen oder nicht.
Ich bin nicht wirklich Fehler oder Abstürze bekommen, aber ich einige Nutzer-Feedback erhalten Abstürze berichten, dass ich nicht wiedergeben kann, so dass ich Gessing ich etwas falsch mit diesem tue.

Meine aktuelle Verarbeitung ist diese:

onStart() {// somewhere in the UI thread  
new MyTask(Constants.theObject).execute(); // (1)  
}  
// ...  
class MyTask extends AsyncTask<...> {  
MyObjectType object;  
MyTask(MyObjectType theObjectInstance) {  
object = theObjectInstance; // (2)  
// ...  
doInBackground() { // (3)  
//  ...  
} 

In (1), Constants.theObject ist ein statisches Objekt beim Start der Anwendung erstellt

In (2), bekomme ich einen Verweis auf das vorhandene statische Objekt Constants.theObject

In (3), wir sind nicht mehr in der UI-Thread, und ich möchte den Zugang Constants.theObject (die auch im Hauptthread verwendet werden, werden kann)

.

Ich denke, es gibt drei mögliche Fälle.

  • Dieser Code ist hässlich, ich sollte sonst tun
  • Dieser Code ist in Ordnung, das Benutzer-Feedback ist nicht zu diesem
  • Dieser Code ist ganz in Ordnung, aber ich sollte eine Kopie Constants.theObject machen, wenn ich es in doInBackground verwenden möchten; sonst kann es versagen

Ich hoffe, dass Sie mir helfen können! Vielen Dank für das Lesen.

War es hilfreich?

Lösung

Von dem, was Sie geschrieben haben, ich glaube nicht, dass Sie eine Kopie machen müssen, es sei denn, MyObjectType ist nicht Thread-sicher, in diesem Fall müssen Sie sicherstellen, dass nur 1 Thread zu einem Zeitpunkt ist Modifizieren / es -Nicht-thread-safe-Methoden. (Eine Kopie zu machen wäre dies in der Tat lösen, aber wenn Sie eine Kopie machen, ist ein globaler statische wirklich was sollte man auf jeden Fall verwenden?)

Sind Sie 100% sicher, dass 1 und 3 kann nur geschehen, nachdem das Objekt initialisiert wurde?

Andere Tipps

Es kann sein, weil mehr als ein Thread versucht, das gleiche Objekt zu ändern. es kann zu unerwarteten Ergebnissen / Totalausfall führen. Sie können wanna have some Sperre verwenden, so dass keine zwei Threads das Objekt in der gleichen Zeit aktualisiert werden. Dieser Fall wird es verlangsamt Ihre asynch Operationen, da sie alle auf genau ein intance abhängen. Ich denke, Sie aus einem bestimmten Grunde statisches Objekt verwenden, können Sie zu prüfen, es auf eine andere Weise, wenn möglich zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top