web-dev-qa-db-fra.com

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 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?

160
uTubeFan

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();
}
210
corsiKa

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

41
HaoQi Li
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.

30
Tommi Rouvali

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;
    }
}
11
ubiquibacon

Vous avez deux options:

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

  2. Demandez à votre classe anonyme de fermer sur votre "paramètre". Assurez-vous de le marquer comme final.

10
rlibby

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

5
atlantis