publishProgress à partir de l'intérieur d'une fonction dans doInBackground?
- Je utiliser un AsyncTask pour effectuer un long processus.
Je ne veux pas mettre mon long processus de code directement à l'intérieur de doInBackground. Au lieu de mon long processus de code se trouve dans une autre classe, que j'appelle dans doInBackground.
Je voudrais être en mesure d'appeler publishProgress de l'intérieur de la longProcess fonction.
En C++, j'aimerais passer un pointeur de rappel à publishProgress à mon longProcess fonction.
Comment puis-je le faire en java ?
EDIT:
Mon long processus code:
public class MyLongProcessClass
{
public static void mylongProcess(File filetoRead)
{
//some code...
//here I would like to call publishProgress
//some code...
}
}
Mon AsyncTask code:
private class ReadFileTask extends AsyncTask<File, Void, Boolean>
{
ProgressDialog taskProgress;
@Override
protected Boolean doInBackground(File... configFile)
{
MyLongProcessClass.mylongProcess(configFile[0]);
return true;
}
}
EDIT #2
Le long processus de la méthode pourrait également être non-statique et appelé comme ceci:
MyLongProcessClass fileReader = new MyLongProcessClass();
fileReader.mylongProcess(configFile[0]);
Mais cela ne change pas mon problème.
Vous devez vous connecter pour publier un commentaire.
La difficulté est que
publishProgress
estprotected final
donc, même si vous passezthis
dans votrestatic
appel de méthode vous ne pouvez toujours pas d'appelpublishProgress
directement.Je n'ai pas essayé moi-même, mais que diriez-vous:
Si cela fonctionne s'il vous plaît laissez-moi savoir! Noter que l'appel
doProgress
à partir de n'importe où d'autre qu'une méthode qui a été appelé à partir dedoInBackground
va certainement causer une erreur.Se sent assez sale pour moi, quelqu'un d'autre a une meilleure façon?
Une solution pourrait être de placer un simple
public
de classe à l'intérieur de l'AsyncTask (assurez-vous que la tâche que vous définissez est égalementpublic
) qui a unpublic
méthode qui appellepublishProgress(val)
. En passant cette classe devrait être disponible à partir de n'importe quel autre paquet ou de la classe.puis dans l'autre classe:
Cela a fonctionné pour moi.
Diviser le
longProcess()
fonction en petites fonctions.Exemple de code:
Oui, il fonctionne. J'ai prolongé de sorte que vous n'avez pas besoin de passer l'AsyncTask en tant que paramètre à la méthode. Ceci est particulièrement utile si (comme moi) vous avez déjà écrit toutes vos méthodes avant de décider qu'en fait, vous ne devez publier quelques progrès, ou dans mon cas, la mise à jour de l'INTERFACE utilisateur à partir d'un AsyncTask:
Ma façon de procéder est probablement pire. Je suis d'appeler une méthode statique pour doProgress (que j'ai appelée publishProgressCustom). Elle peut être appelée à partir de n'importe où, sans produire une erreur (comme si le fil n'a pas de correspondant AsyncTask dans la table de hachage, il ne fera pas appel publishProgress). L'inconvénient est que vous devez ajouter le Fil d'AsyncTask cartographie de vous-même après que le thread a commencé. (Vous ne pouvez pas remplacer AsyncTask.execute() malheureusement, comme c'est définitif). Je l'ai fait ici, en substituant doInBackground() dans la classe supérieure, de sorte que quiconque, l'extension, il suffit de le mettre super.doInBackground() la première ligne dans leur propre doInBackground().
Je ne sais pas assez sur les Threads et les AsyncTask pour savoir ce qui se passe à la table de hachage références une fois le Fil et/ou AsyncTask vient à une fin. Je soupçonne que de mauvaises choses arrivent, donc je ne dirais pas que quiconque essayer ma solution dans le cadre de leur propre, à moins qu'ils savent mieux
Quand vous dites "mon long processus de code se trouve dans une autre classe que j'appelle dans doInBackground", voulez-vous dire "situé dans un autre méthode que j'appelle dans doInBackground"?
Si oui, vous pourriez faire de cette méthode une méthode privée de votre AsynTask classe. Vous pouvez ensuite appeler publishProgress à l'intérieur de la méthode chaque fois que nécessaire.