AsyncTask-Verständnis und Variablen

Z

zauber3r

Erfahrenes Mitglied
23
Hallo,

hiermit übergebe ich username und password an den Asynctask

Code:
   public void loginPost(View view){
      String username = usernameField.getText().toString();
      String password = passwordField.getText().toString();
      new SinginAsyncTask(this).execute(username,password);

das funktioniert wunderbar.

im nicht gezeigten code checke ich ob der login gültig ist, und dann
starte ich im onPostExecute eine neue Activity.

Code:
protected void onPostExecute(String result){ ..
....

...         Intent nextScreen = new Intent(context, KstmenuActivity.class);
            context.startActivity(nextScreen);

alles gut soweit.

ich benötige jedoch den username im weiteren verlauf meiner app öfters.
wie übergebe ich diese korrekt? ich habe bisher mit globalen variablen gearbeitet aber das ist unsauber und ich möchte den korrekten weg gehen.

von activity zu activity übergebe ich ja mit einem bundle, wie stelle ich das aber an, wenn das ganze wie oben über einen AsyncTask läuft?
 
Ich weiß nicht wo das herkommt, das Statics unsauber wären, aber egal... Dein Result ist ist ein String, eine Möglichkeit wäre, dort Trennzeichen und dann den User anzufügen, und dann in der PostExecute wieder zu splitten (das ist m. E. aber unsauber:
Code:
	@Override
	protected String doInBackground(String... params) {
		...
		...
		return result + "#" + username;
	}

	@Override
	protected void onPostExecute(String result) {
		String[] spliterg = result.split("#");
		String ergebnis = spliterg[0];
		String username = spilterg[1];
		...
		...
	}

Eine andere Alternative wäre den ASyncTask so zudefinieren, das nicht String sondern ein String Array als result übergeben wird:

Code:
public class MyTask extends AsyncTask<String, Void, String[]> {
	....
	....
	protected String[] doInBackground(String... params) {
	...
		String[] result = {ergebnis, username};
		return result;
	}

	protected void onPostExecute(String result[]) {
		String ergebnis = result[0];
		String username = result[1];
	}
}

Eine weitere Möglichkeit wäre dir ein Java Object für die Ergebnisverarbeitung zu machen.

Code:
public class MyResult {
	private String result;
	private String username;

	public String getResult() {
		return result;
	}
	public void setResult(String result) {
		this.result = result;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}

}

Und dann den ASyncTask entsprechend mit einem MyResult object:

Code:
public class MyTask extends AsyncTask<String, Void, MyResult> {
	....
	....
	protected MyResult doInBackground(String... params) {
	...
		MyResult myResult = new MyResult();
		myResult.setUsername(username);
		myResult.setResult(result);
		return myResult;
	}

	protected void onPostExecute(MyResult result) {
		String ergebnis = result.getResult();
		String username = result.getUsername();
		...
	}
}
 
Anmerkung zu globalen Variablen:

Sie sind nicht unsauber, aber man sollte sie nur benutzen, wenn man sie wirklich braucht!

Die Kapselung von Programmcode ist einer er fundamentalen Konzepte der OPP. Auf globale Variablen kann von überall her im Programmcode aufgerufen werden. Das kann zu extrem nervigen Fehler führen, wenn z.B. zwei unterschiedliche Funktionen auf die gleiche Variable zu greifen. Insbesondere in größeren Projekten mit mehreren Entwickler kann die Fehlersuche zu einem epischen Task ausarten.
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
137
swa00
swa00
Laser5001
Antworten
3
Aufrufe
650
swa00
swa00
M
Antworten
8
Aufrufe
1.685
swa00
swa00
Zurück
Oben Unten