web-dev-qa-db-ja.com

パラメータで実行可能ですか?

「パラメーターを受け入れるRunnable」が必要なのは、そのようなRunnableが実際には存在しないことを知っているからです。

これは、アプリの設計の根本的な欠陥や疲れた脳の精神的なブロックを指している可能性があるため、次のような方法を達成するためのアドバイスをここで見つけたいと考えていますwithout violating基本的なOO原則:

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

上記のようなことを達成する方法はありますか?

157
uTubeFan

メソッド内でクラスを宣言できます

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

関数に入れることができます。

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で、これを使用してID-> myRunnablesのハッシュマップを作成しました。そのように、ハッシュマップを使用してハンドラー内の異なるmyRunnableオブジェクトをポスト/削除できます。)

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

オブジェクト自体を返す初期化関数を作成し、それを使用してパラメーターを初期化します。

30
Tommi Rouvali

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

次の2つのオプションがあります。

  1. 名前付きクラスを定義します。名前付きクラスのコンストラクターにパラメーターを渡します。

  2. 「パラメーター」の上に匿名クラスを配置します。必ずfinalとしてマークしてください。

10
rlibby

私はまず、新しいRunnable()またはrun()に引数を渡す必要があるために、ここで何を達成しようとしているのかを知りたいと思います。通常の方法は、開始する前にメンバー変数を設定してdata(str)をスレッドに渡すRunnableオブジェクトを持つことです。次に、run()メソッドはこれらのメンバー変数値を使用してsomeFunc()を実行します

5
atlantis