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