Impossible d'afficher une Alert Dialog dans un thread!
Bonjour à tous,
Je suis en train de développer une application dans laquelle j'ai une activité qui exécute un thread. Dans ce thread, j'appelle une fonction qui envoie une requête HTTP à un serveur, puis qui parse avec le Framework jSoup la page renvoyée.
Cette fonction (appelée requestAndMakeSheet() dans mon code ci-dessous) renvoie une exception si le parsing jSoup ne trouve pas certains éléments dans la page (ce qui veut dire que le login/mot de passe n'est pas bon, en fait).
Je voudrais que ce thread affiche un message d'erreur à l'utilisateur quand cette exception est levée, puis qu'il le renvoie vers l'activité principale, où il doit saisir ses identifiants.
Si par contre l'exception n'est pas levée, l'activité affiche la page HTML dans une webView.
Voici le code de mon thread:
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
| thereIsSomethingToShow=true;
//Envoyer la requête au site
t1 = new Thread(new Runnable() //ReservationInfo.this.runOnUiThread(new Runnable() -> si je mets ça ici, l'app plante!
{
public void run()
{
Looper.prepare();
StringBuffer stringBuffer = new StringBuffer("");
BufferedReader bufferedReader = null;
URI uri = null;
try
{
requestAndMakeSheet(stringBuffer, bufferedReader, uri);
}
catch (Exception e)
{
thereIsSomethingToShow=false;
ReservationInfo.this.runOnUiThread(new Runnable()
{
public void run()
{
AlertDialog.Builder parsingErrorBox = new AlertDialog.Builder(ReservationInfo.this);
parsingErrorBox.setTitle("Login error");
parsingErrorBox.setMessage("You may have to check your credentials and then try again.");
parsingErrorBox.setNeutralButton("OK",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
dialog.dismiss();
}
});
parsingErrorBox.show();
}
});
}
finally
{
if (bufferedReader!=null)
{
try
{
bufferedReader.close();
}
catch (IOException ioe)
{
Log.e("Web Request Error", ioe.getMessage());
}
}
}
}
});
t1.start();
try
{
t1.join();
if (thereIsSomethingToShow)
{
mWebview.loadUrl("file:///"+Environment.getExternalStorageDirectory()+"/ReservationSheet3.html");
setContentView(mWebview);
}
else
{
//Return to main activity
Intent myIntent = new Intent(this.getBaseContext(), MainActivity.class);
startActivityForResult(myIntent, 0);
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
} |
Le seul problème que je rencontre avec ce code par rapport à ce que je veux, c'est que le message d'erreur ne s'affiche pas avant le retour à l'activité principale.
J'ai essayé plein de trucs vus sur StackOverflow, mais y a rien à faire! Ce sont eux entre autres qui m'ont dit d'entourer mon message d'un thread runOnUiThread, mais le mettre ou pas n'a donné aucune différence. Et si je le mets en lieu et place du thread t1 tout en haut, l'app plante dès qu'elle arrive sur l'activité qui contient ce thread!?
Pourriez-vous m'aider à comprendre ce qui se passe?
Merci d'avance.
Il faut utiliser un AsyncTask
La classe AsyncTask est typiquement faite pour cela, et très simple à utiliser.
Explication dans les cours et tutoriels pour apprendre Android : http://android.developpez.com/cours/