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 ce qui suit, sans violer principes fondamentauxOO:
private Runnable mOneShotTask = new Runnable(String str) {
public void run(String str) {
someFunc(str);
}
};
Une idée de comment accomplir quelque chose comme ce qui précède?
Vous pouvez déclarer une classe directement dans la méthode
void Foo(String str) {
class OneShotTask implements Runnable {
String str;
OneShotTask(String s) { str = s; }
public void run() {
someFunc(str);
}
}
Thread t = new Thread(new OneShotTask(str));
t.start();
}
Vous pouvez le mettre dans une fonction.
String paramStr = "a parameter";
Runnable myRunnable = createRunnable(paramStr);
private Runnable createRunnable(final String 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 objets myRunnable dans un gestionnaire.)
theView.post(new Runnable() {
String str;
@Override
public void run() {
par.Log(str);
}
public Runnable init(String pstr) {
this.str=pstr;
return(this);
}
}.init(str));
Crée une fonction init qui retourne l'objet lui-même et initialise les paramètres avec.
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.
Demandez à votre classe anonyme de fermer 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 objet 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 membre pour exécuter someFunc ()