Runnable с параметром?

Мне нужна "Runnable, которая принимает параметр", хотя я знаю, что такая runnable не существует.

Это может указывать на фундаментальный недостаток в дизайне моего приложения и/или ментального блока в моем усталом мозгу, поэтому я надеюсь найти здесь несколько советов о том, как выполнить что-то вроде следующего, не нарушая основополагающих принципов OO:

  private Runnable mOneShotTask = new Runnable(String str) {
    public void run(String str) {
       someFunc(str);
    }
  };  

Любая идея, как выполнить что-то вроде выше?

Ответ 1

Вы можете объявить право класса в методе

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

Ответ 2

Вы можете поместить его в функцию.

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;

}

(Когда я использовал это, мой параметр был идентификатором целого числа, который я использовал для создания хэш-карты ID → myRunnables. Таким образом, я могу использовать hashmap для отправки/удаления разных объектов myRunnable в обработчике.)

Ответ 3

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

Создайте функцию init, которая возвращает объект и инициализирует его с помощью.

Ответ 4

Я использую следующий класс, который реализует интерфейс Runnable. С помощью этого класса вы можете легко создавать новые потоки с аргументами

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

Ответ 5

У вас есть два варианта:

  • Определите именованный класс. Передайте свой параметр конструктору именованного класса.

  • Подключите ваш анонимный класс к своему "параметру". Обязательно отметьте его как final.

Ответ 6

Сначала я хотел бы знать, что вы пытаетесь выполнить здесь, чтобы потребовать аргумент, который нужно передать новому Runnable() или run(). Обычный способ должен состоять в том, чтобы иметь объект Runnable, который передает данные (str) в свои потоки, задавая переменные-члены перед запуском. Затем метод run() использует эти значения переменных-членов для выполнения функции someFunc()