J’ai besoin d’un “Runnable qui accepte un paramètre” bien que je sache qu’un tel runnable n’existe pas vraiment.
Cela peut indiquer un défaut fondamental dans la conception de mon application et / ou un blocage mental dans mon cerveau fatigué. J’espère donc trouver ici quelques conseils sur la manière d’accomplir quelque chose comme celui-ci, sans enfreindre les principes fondamentaux de OO:
private Runnable mOneShotTask = new Runnable(Ssortingng str) { public void run(Ssortingng str) { someFunc(str); } };
Une idée de comment accomplir quelque chose comme ci-dessus?
Vous pouvez déclarer une classe directement dans la méthode
void Foo(Ssortingng str) { class OneShotTask implements Runnable { Ssortingng str; OneShotTask(Ssortingng s) { str = s; } public void run() { someFunc(str); } } Thread t = new Thread(new OneShotTask(str)); t.start(); }
Vous pourriez le mettre dans une fonction.
Ssortingng paramStr = "a parameter"; Runnable myRunnable = createRunnable(paramStr); private Runnable createRunnable(final Ssortingng paramStr){ Runnable aRunnable = new Runnable(){ public void run(){ someFunc(paramStr); } }; return aRunnable; }
(Lorsque je l’utilisais, mon paramètre était un ID entier, que j’avais utilisé pour créer une table de hachage avec ID -> myRunnables. Ainsi, je peux utiliser la table de hachage pour publier / supprimer différents objects myRunnable dans un gestionnaire.)
theView.post(new Runnable() { Ssortingng str; @Override public void run() { par.Log(str); } public Runnable init(Ssortingng pstr) { this.str=pstr; return(this); } }.init(str));
Créez la fonction init qui renvoie l’object lui-même et initialise les parameters avec lui.
J’utilise la classe suivante qui implémente l’interface Runnable . Avec cette classe, vous pouvez facilement créer de nouveaux threads avec des arguments
public abstract class RunnableArg implements Runnable { Object[] m_args; public RunnableArg() { } public void run(Object... args) { setArgs(args); run(); } public void setArgs(Object... args) { m_args = args; } public int getArgCount() { return m_args == null ? 0 : m_args.length; } public Object[] getArgs() { return m_args; } }
Vous avez deux options:
Définir une classe nommée. Passez votre paramètre au constructeur de la classe nommée.
Faites fermer votre classe anonyme sur votre “paramètre”. Assurez-vous de le marquer comme final
.
J’aimerais tout d’abord savoir ce que vous essayez d’accomplir ici pour qu’un argument soit passé à new Runnable () ou à run (). La méthode habituelle consiste à avoir un object Runnable qui transmet des données (str) à ses threads en définissant des variables membres avant de commencer. La méthode run () utilise ensuite ces valeurs de variable membres pour exécuter someFunc ()