Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Java & Mobiles > Android
Android Forum d'entraide sur Android, la plateforme mobile de Google pour téléphones portables et Smartphones. Avant de poster -> FAQ Android
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 16h09   #1
DummyDev
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 2
Points : 2
Par défaut Démarrer une activité depuis une AsyncTask

Bonjour à vous.

Je suis en train d'apprendre le développement Android, et, très mauvais en Java, je m'arrache depuis ce matin les cheveux sur un point qui doit être simple malgré tout.

Mon activité FullScreenActivity est un login (deux champs textes) et le bouton Connexion appelle donc une seconde activity ParlezVousTask. Jusque là, tout va bien, mais j'aimerais démarrer une troisième activity (MenuActivity) sur onPostExecute() de cette task, et c'est là que je bloque.

Les posts et tutos que j'ai pu parcourir indiquent qu'il faut utiliser la méthode startActivity(), mais j'ai l'erreur suivante:
The method startActivity(Intent) is undefined for the type ParlezVousTask.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package com.example.appandroid;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
 
import com.example.appandroid.util.SystemUiHider;
 
/**
 * An example full-screen activity that shows and hides the system UI (i.e.
 * status bar and navigation/system bar) with user interaction.
 * 
 * @see SystemUiHider
 */
public class FullscreenActivity extends Activity {
 
	private static final String TAG = "Toto";
	private EditText input_login;
	private EditText input_pass;
	private ProgressBar progressbar;
	private String login;
	private String pass;
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_fullscreen);
		Log.i(TAG, "onCreate!");
		input_login = (EditText) findViewById(R.id.input_login);
		input_pass = (EditText) findViewById(R.id.input_pass);
		progressbar = (ProgressBar) findViewById(R.id.progressBar);
 
		Button button_effacer = (Button) findViewById(R.id.button_clear);
		button_effacer.setOnClickListener(new OnClickListener() {
 
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				input_login.setText("");
				input_pass.setText("");
 
			}
		});
 
		Button button_valider = (Button) findViewById(R.id.button_send);
		button_valider.setOnClickListener(new OnClickListener() {
 
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				login = input_login.getText().toString();
				pass = input_pass.getText().toString();
				new ParlezVousTask(progressbar, login, pass).execute(login, pass);
				Toast.makeText(FullscreenActivity.this, "Toast !", Toast.LENGTH_SHORT).show();
			}
		});
	}
 
	@Override
	protected void onDestroy() {
		Log.i(TAG, "onDestroy!");
		// TODO Auto-generated method stub
		super.onDestroy();
 
	}
 
	@Override
	protected void onPause() {
		Log.i(TAG, "onPause!");
		// TODO Auto-generated method stub
		super.onPause();
	}
 
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		Log.i(TAG, "onRestoreInstanceState!");
		super.onRestoreInstanceState(savedInstanceState);
	}
 
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		Log.i(TAG, "onResume!");
		super.onResume();
	}
 
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		Log.i(TAG, "onSaveInstanceState!");
		super.onSaveInstanceState(outState);
	}
 
	@Override
	public void startActivity(Intent intent) {
		// TODO Auto-generated method stub
		super.startActivity(intent);
	}
}
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.example.appandroid;
 
import java.io.InputStream;
 
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.content.Intent;
import android.sax.StartElementListener;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
 
public class ParlezVousTask extends android.os.AsyncTask<String, Void, Boolean> {
 
	private final ProgressBar loading;
	private ProgressBar progressbar;
	private String login;
	private String pass;
 
	public ParlezVousTask(ProgressBar loading, String login, String pass) {
		this.loading = loading;
		this.login = login;
		this.pass = pass;
 
	}
 
	@Override
	protected Boolean doInBackground(String... params) {
 
		String login = params[0];
		String pass = params[1];
 
		// TODO Auto-generated method stub
		HttpClient mClient = new DefaultHttpClient();
		HttpGet get = new HttpGet("http://***/connect/"
				+ login + "/" + pass);
		try {
			HttpResponse res = mClient.execute(get);
			InputStream content = res.getEntity().getContent();
			String contentString = InputStreamToString.convert(content);
 
 
 
		} catch (Exception e) {
			e.printStackTrace();
		}
 
		return null;
	}
 
	@Override
	protected void onPostExecute(Boolean result) {
		loading.setVisibility(View.INVISIBLE);
		ParlezVousTask.startActivity(new Intent(ParlezVousTask, MenuActivity.class));
 
	}
 
	@Override
	protected void onPreExecute() {
 
		loading.setVisibility(View.VISIBLE);
	}
 
 
}
Merci d'avance si vous pouviez m'aider à me débloquer. Je commence à tout mélanger et je ne comprends pas non plus pourquoi quelque chose du type New MenuActivity(...) ne fonctionne pas.

Bien cordialement.
DummyDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h16   #2
Hephaistos007
Membre Expert
 
Avatar de Hephaistos007
 
Inscription : décembre 2004
Messages : 1 618
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 1 618
Points : 1 971
Points : 1 971
Simplement parce que la méthode startActivity appartient à la classe Context. A toi d'amener une instance de ce contexte jusqu'à ton AsyncTask (via son constructeur typiquement) pour pouvoir l'invoquer.
__________________
Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

Retrouvez mes cours et tutos autour d'Android/Java/Eclipse sur http://olegoaer.developpez.com/
Hephaistos007 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 19h11   #3
DummyDev
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 2
Points : 2
Merci pour la piste. J'ai "réussi" à éliminer mon erreur sur le code, mais l'application plante au démarrage et est stoppée. J'ai juste rajouté cette variable
private Context actvitiyContext = this.getApplicationContext();
dans mon activité FullScreenActivity passée en paramètre dans le constructeur de ma task.

La ligne démarrant l'activité dans la task est commentée, mais le crash subsiste toujours.

Est-ce bien là la manière de faire ?

Édit: je crois qu'il s'agit d'une NullPointerException.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package com.example.appandroid;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.content.Context;
 
import com.example.appandroid.util.SystemUiHider;
 
/**
 * An example full-screen activity that shows and hides the system UI (i.e.
 * status bar and navigation/system bar) with user interaction.
 * 
 * @see SystemUiHider
 */
public class FullscreenActivity extends Activity {
 
	private static final String TAG = "Toto";
	private EditText input_login;
	private EditText input_pass;
	private ProgressBar progressbar;
	private String login;
	private String pass;
        private Context actvitiyContext = this.getApplicationContext();
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_fullscreen);
		Log.i(TAG, "onCreate!");
		input_login = (EditText) findViewById(R.id.input_login);
		input_pass = (EditText) findViewById(R.id.input_pass);
		progressbar = (ProgressBar) findViewById(R.id.progressBar);
 
		Button button_effacer = (Button) findViewById(R.id.button_clear);
		button_effacer.setOnClickListener(new OnClickListener() {
 
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				input_login.setText("");
				input_pass.setText("");
 
			}
		});
 
		Button button_valider = (Button) findViewById(R.id.button_send);
		button_valider.setOnClickListener(new OnClickListener() {
 
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				login = input_login.getText().toString();
				pass = input_pass.getText().toString();
 
				new ParlezVousTask(progressbar, login, pass, actvitiyContext).execute(login, pass);
				Toast.makeText(FullscreenActivity.this, "Toast !", Toast.LENGTH_SHORT).show();
			}
		});
	}
 
	@Override
	protected void onDestroy() {
		Log.i(TAG, "onDestroy!");
		// TODO Auto-generated method stub
		super.onDestroy();
 
	}
 
	@Override
	protected void onPause() {
		Log.i(TAG, "onPause!");
		// TODO Auto-generated method stub
		super.onPause();
	}
 
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		Log.i(TAG, "onRestoreInstanceState!");
		super.onRestoreInstanceState(savedInstanceState);
	}
 
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		Log.i(TAG, "onResume!");
		super.onResume();
	}
 
	@Override
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		Log.i(TAG, "onSaveInstanceState!");
		super.onSaveInstanceState(outState);
	}
 
	@Override
	public void startActivity(Intent intent) {
		// TODO Auto-generated method stub
		super.startActivity(intent);
	}
}
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.example.appandroid;
 
import java.io.InputStream;
 
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.sax.StartElementListener;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;
 
public class ParlezVousTask extends android.os.AsyncTask<String, Void, Boolean> {
 
	private final ProgressBar loading;
	private ProgressBar progressbar;
	private String login;
	private String pass;
	private Context context;
 
	public ParlezVousTask(ProgressBar loading, String login, String pass, Context context) {
		this.loading = loading;
		this.login = login;
		this.pass = pass;
		this.context=context;
	}
 
	@Override
	protected Boolean doInBackground(String... params) {
 
		String login = params[0];
		String pass = params[1];
 
		// TODO Auto-generated method stub
		HttpClient mClient = new DefaultHttpClient();
		HttpGet get = new HttpGet("http://***/connect/"
				+ login + "/" + pass);
		try {
			HttpResponse res = mClient.execute(get);
			InputStream content = res.getEntity().getContent();
			String contentString = InputStreamToString.convert(content);
 
 
 
		} catch (Exception e) {
			e.printStackTrace();
		}
 
		return null;
	}
 
	@Override
	protected void onPostExecute(Boolean result) {
		loading.setVisibility(View.INVISIBLE);
		//context.startActivity(new Intent(context, MenuActivity.class));
 
	}
 
	@Override
	protected void onPreExecute() {
 
		loading.setVisibility(View.VISIBLE);
	}
}
DummyDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 21h11   #4
nicroman
Modérateur
 
Homme Nicolas Romantzoff
Ingénieur systèmes et réseaux
Inscription : février 2007
Messages : 2 972
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Romantzoff
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2007
Messages : 2 972
Points : 5 226
Points : 5 226
Envoyer un message via Skype™ à nicroman
Tu ne peux pas référencer 'this' dans les constructions automatique ('this' n'est pas encore instancié).
D'autre part cette solution n'a aucun différence avec appeler directement getApplicationContext() depuis le code donc n'apporte rien.

Et puis c'est completement inutile vu que l'Application est elle meme un context !
(il suffit donc de passer "this")
__________________
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
nicroman est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2013, 17h15   #5
DummyDev
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 2
Points : 2
Merci beaucoup pour cette nouvelle piste, qui m'a débloqué. A priori, je me rapproche du but, mais une erreur subsiste, cette fois du côté de ma MenuActivity. Le crash intervient après la onPostExecution de ma task.

L'erreur est une InstantiationException,avec comme précision "no empty constructor".

Meme si l'erreur ne vient probablement pas de là, je précise que j'ai rajouté une ligne au manifest:
<activity android:name=".MenuActivity" />

J'ai pu constater que certains avait solutionnés ce problème avec super("...") dans le constructeur mais dans mon cas Eclipse ne me propose que super(), ce qui ne m'avance pas d'avantage.

Ici est le morceau de code appelant l'activity.
Code :
1
2
3
4
5
6
7
8
	@Override
	protected void onPostExecute(Boolean result) {
		loading.setVisibility(View.INVISIBLE);
		Intent i = new Intent(context, MenuActivity.class);
		i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		context.startActivity(i);
 
	}
L'activity appelée.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.example.appandroid;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
 
import com.example.appandroid.util.SystemUiHider;
 
/**
 * An example full-screen activity that shows and hides the system UI (i.e.
 * status bar and navigation/system bar) with user interaction.
 * 
 * @see SystemUiHider
 */
public class MenuActivity extends Activity {
 
	private final ProgressBar loading;
	private ProgressBar progressbar;
	private String login;
	private String pass;
 
	private MenuActivity(ProgressBar loading, String login, String pass) {
        super(); 
		this.loading = loading;
		this.login = login;
		this.pass = pass;
	}
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_menu);
		progressbar = (ProgressBar) findViewById(R.id.progressBar);
 
		Button button_list = (Button) findViewById(R.id.button_list);
		button_list.setOnClickListener(new OnClickListener() {
 
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
 
				//new ParlezVousTask(progressbar).execute(login, pass);
				Toast.makeText(MenuActivity.this, "Toast !", Toast.LENGTH_SHORT).show();
			}
		});
 
		Button button_write = (Button) findViewById(R.id.button_write);
		button_write.setOnClickListener(new OnClickListener() {
 
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
 
				//new ParlezVousTask(progressbar).execute(login, pass);
				Toast.makeText(MenuActivity.this, "Toast !", Toast.LENGTH_SHORT).show();
			}
		});
	}
 
}
DummyDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 17h42   #6
nicroman
Modérateur
 
Homme Nicolas Romantzoff
Ingénieur systèmes et réseaux
Inscription : février 2007
Messages : 2 972
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Romantzoff
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2007
Messages : 2 972
Points : 5 226
Points : 5 226
Envoyer un message via Skype™ à nicroman
Pourquoi un constructeur à l'activité ?

Une activité DOIT avoir un constructeur public sans paramètre (ou pas de constructeur du tout).

Et en aucun cas un constructeur privé avec paramètres, sinon comment le système pourra la construire ? comment saura-t-il quel paramètre passer ?
__________________
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
nicroman est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/01/2013, 18h10   #7
DummyDev
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 2
Points : 2
Effectivement, je viens de résoudre le problème de cette manière-ci, le constructeur étant de trop.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.example.appandroid;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
 
import com.example.appandroid.util.SystemUiHider;
 
public class MenuActivity extends Activity {
 
	private final String TAG = MenuActivity.class.getSimpleName();
 
	private Button button_list;
	private Button button_write;
	private String login = "";
	private String pass = "";
 
 
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.i(TAG, "onCreate!");
		setContentView(R.layout.activity_menu);
 
		Intent intent = getIntent();		
		if (intent != null) {
			login = intent.getStringExtra("login");
			pass = intent.getStringExtra("pass");
		}
 
	}
 
}
Il me reste encore deux activities à lancer depuis ce nouveau menu, et comme malgré votre aide, cela reste un peu obscur pour moi, je laisse le fil ouvert au cas où je rencontre d'autres problèmes. Je devrais cependant m'en sortir avec les éléments que vous m'avez apportés. Je le passerai en "résolu" dès que cette sombre histoire de vues sera passée.

Merci beaucoup pour vos interventions !
DummyDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h33.


 
 
 
 
Partenaires

Hébergement Web