Solution de messagerie instantanée pour mon problème.
J'appelle un AsynccTask code> dans mon
Activité Code>: P>
boolean valid = login.execute();
4 Réponses :
Construisez votre base d'asyncaptage comme: } p> p>
Pourriez-vous m'expliquer davantage, quel CallMyMyMéthoodwithTheUpdatedValue (valide) `faire et comment l'invoquer?
Onpostexecute est appelé à partir du fil principal à droite après la mise en place de DOINbackground, vous pouvez donc appeler toute autre méthode définie dans l'activité avec la valeur correcte; au lieu de retourner la valeur de l'asyncaptage. Jetez un coup d'œil à cela pour plus de détails: Stackoverflow.com/a/15762539/5382017
Merci de vos conseils, mais faites référence à deux objets entier avec un booléen code> c'est trop nombreux je pense. Il n'y a pas de moyen de revenir que
bool code> à partir de
onpostexecute () code>?
Si vous souhaitez réagir après l'onpostexecute, vous pouvez modifier un peu votre code et mettre en œuvre une interface pour le faire: essentiellement, vous instaniez un auditeur dans votre activité et appelez la méthode de cet auditeur de votre surpostexecute (). Suivez à nouveau ce lien pour plus d'informations: Stackoverflow.com/a/13815960/5382017
Changer votre code comme Code ci-dessous:
public class Login extends AsyncTask<String, Boolean, Boolean> { public Login(Application application){ repository = new Repository(application); } @Override protected Boolean doInBackground(String... body){ try { user = repository.getUser(body[0], body[1]); if (user != null) return Boolean.TRUE; //wont work else { return Boolean.FALSE; } } catch(Exception e){ return Boolean.FALSE; } } protected void onPostExecute(Boolean result) { //i want to have bool value here that i will see in my activity Log.e("POST_EXECUTE", "" + result); }
Et comment obtenir résultat code> dans mon activité? Je pense que sa seule chose que je ne comprends pas
Méthode d'activité d'appel de Onpostexecute code> avec une valeur de passage
Modifier le type Pour cette dernière partie, vous pouvez avoir un interface et avoir que quelqu'un (en beintre classe) l'implémenter. p> puis supposez que vous souhaitiez que la mainActivité réagisse sur la connexion: P> Onpostexecute () Code> Type d'argument sur
Boolean CODE> puis savoir qui serait intéressé par le résultat Ce qui s'est passé.
public class MainActivity extends AppCompatActitvity implements LoginListener{
....
// When you create the Login object, in onCreate() for example:
// new Login(application, this); // this is the activity acting as listener...
@Override public void onLoginPerformed(Boolean result){
// do what you want to do with the result in Main Activity
}
}
L'idée de l'asyncaptage n'est pas de "obtenir" un résultat mais de faire quelque chose se passe en arrière-plan sans bloquer l'interface utilisateur. Votre approche bloquera le fil de l'interface utilisateur et jusqu'à ce que le serveur renvoie une réponse L'application sera bloquée et si cet état reste plus de 5 secondes, l'utilisateur verra un ANR
mais pour répondre à votre question:
Dans Oder pour obtenir le résultat booléen de la base d'asyncaptage, vous devez étendre la classe correcte, dans votre cas, c'est le cas: Les trois types utilisés par une tâche asynchrone sont les suivants: em> p>
Progress strong>, le type des unités de progression publiées lors de l'informatique de fond. p>
résultat fort>, le type du résultat du calcul d'arrière-plan. p>
blockQuote> Pour répondre à votre question, votre code sera le suivant: p> ni pour une solution qui fonctionnera réellement:
Je suggère que chaque fois qu'un utilisateur souhaite vous connecter à l'application doit présenter une fenêtre AsynccTask
ProgressDialog CODE> Informer l'utilisateur qu'il doit effectuer une tâche de consommation de temps et, après la fin du processus, informez l'utilisateur de la statut.
Pour ce faire, utilisez ce code suivant: P>
//USAGE
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
Login l = new Login();
l.execute("user", "pass");
/* but the UI thread will be
blocked, meaning the following code will not be executed until the
variable valid is populated */
}
public void userLoggedIn() {
// do something when a user loggs in sucessfully
}
public void wrongCredentials() {
// alert the user that he didn't put in the correct credentials
}
//AsyncTask
public class Login extends AsyncTask<String, Void, Boolean> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// show a dialog window here when the AsyncTask starts
}
@Override
protected Boolean doInBackground(String... strings){
try {
user = repository.getUser(strings[0], strings[1]);
if (user != null)
return true; //wont work
else {
return false;
}
}
catch(Exception e){
return null;
}
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
// dismiss the dialog window here after the AsyncTask finishes
if (aBoolean) {
userLoggedIn();
} else {
wrongCredentials();
}
}
}
Merci pour belle replay! Mais je veux stocker connecter code>
asynccttack code> classe dans le fichier Java Diffrent. Est-il possible d'afficher quelque chose comme la boîte de dialogue de processus dans ce
Connexion code> classe?
"Dialogue de processus"? Voulez-vous dire "Dialogue de progrès"?
Oui, dialogue de progression
Vous pouvez afficher la boîte de dialogue de progrès (mais puisqu'il est obsolète, je suggère d'utiliser une alternative - je viens d'appeler cela que pour une compréhension facile), même si le type d'asyncaptage est dans un fichier séparé. Il suffit de passer un contexte de l'activité que vous appelez le constructeur d'asynchrontage dans le constructeur d'Asynktask et utilisez ce contexte pour la "boîte de dialogue de progression".
AsynccTask Et vous serez prêt à partir. Également basé sur cette signature correcte de cette méthode sera annulée surpostexecute (résultat booléen).