Подтвердить что ты не робот

Есть ли способ передать параметры Runnable?

У меня есть поток, который использует обработчик для отправки экземпляра runnable. он работает хорошо, но мне любопытно, как я буду передавать параметры, которые будут использоваться в экземпляре Runnable? Возможно, я просто не понимаю, как работает эта функция.

Чтобы упредить вопрос "зачем нужен этот", у меня есть потоковая анимация, которая должна перезвонить в поток пользовательского интерфейса, чтобы рассказать ей, что на самом деле делать.

4b9b3361

Ответ 1

Просто класс, реализующий Runnable с конструктором, который принимает параметр, может делать,

public class MyRunnable implements Runnable {
  private Data data;
  public MyRunnable(Data _data) {
    this.data = _data;
  }

  @override
  public void run() {
    ...
  }
}

Вы можете просто создать экземпляр класса Runnable с параметризованным конструктором.

MyRunnable obj = new MyRunnable(data);
handler.post(obj);

Ответ 2

Существуют различные способы сделать это, но самым простым является следующее:

final int param1 = value1;
final int param2 = value2;
... new Runnable() {
    public void run() {
        // use param1 and param2 here
    }
}

Ответ 3

Если вам нужно сообщить информацию в Runnable, вы всегда можете иметь конструктор объекта Runnable, чтобы взять эту информацию или использовать другие методы в Runnable, которые позволяют ей получить эту информацию, или ( если Runnable является анонимным внутренним классом) может объявить соответствующие значения final, чтобы Runnable мог получить к ним доступ.

Надеюсь, это поможет!

Ответ 4

Хотя вы можете использовать любой из вышеперечисленных ответов, но если вы сомневаетесь, действительно беспокоитесь об андроиде, вы также можете использовать AsyncTask.

Ответ 5

Я думаю, что нашел более простой подход:

public interface MyRunnable extends Runnable {
    public void run(int data);
}

public void someMethod(int n, String s, MyRunnable r) {
   ...
   r.run(n);
   ...
}

вызов:

someMethod(5, "Hello", new MyRunnable() {

    @Override
    public void run(int data) {
        // TODO Auto-generated method stub

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
});