Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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.

  2. #2
    Expert Confirmé
    Avatar de Hephaistos007
    Inscrit en
    décembre 2004
    Messages
    1 807
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 1 807
    Points : 2 571
    Points
    2 571

    Par défaut

    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/

  3. #3
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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

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

  4. #4
    Modérateur

    Homme Profil pro Nicolas Romantzoff
    Ingénieur systèmes et réseaux
    Inscrit en
    février 2007
    Messages
    3 682
    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 : 3 682
    Points : 6 381
    Points
    6 381

    Par défaut

    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

  5. #5
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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

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

  6. #6
    Modérateur

    Homme Profil pro Nicolas Romantzoff
    Ingénieur systèmes et réseaux
    Inscrit en
    février 2007
    Messages
    3 682
    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 : 3 682
    Points : 6 381
    Points
    6 381

    Par défaut

    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

  7. #7
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    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

    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •