Runnable avec un paramètre?

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:

  1. Définir une classe nommée. Passez votre paramètre au constructeur de la classe nommée.

  2. 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 ()