我需要一个“接受参数的可运行对象”,尽管我知道这样的可运行对象实际上并不存在。

这可能是我的应用程序设计中的根本缺陷,或者是我疲惫的大脑中的心理障碍,所以我希望在这里找到一些关于如何在不违反基本OO原则的情况下完成以下内容的建议:

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

你知道如何完成上面的事情吗?


当前回答

你可以把它放到一个函数里。

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的hashmap——> myRunnables。这样,我可以使用hashmap在处理程序中发布/删除不同的myRunnable对象。)

其他回答

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函数,返回对象本身并初始化参数。

你可以把它放到一个函数里。

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的hashmap——> myRunnables。这样,我可以使用hashmap在处理程序中发布/删除不同的myRunnable对象。)

我首先想知道你在这里要完成什么,需要一个参数传递给new Runnable()或run()。 通常的方法应该是有一个Runnable对象,它通过在启动前设置成员变量将数据(str)传递给它的线程。run()方法然后使用这些成员变量值执行someFunc()

你有两个选择:

定义一个命名类。将参数传递给命名类的构造函数。 让你的匿名类关闭你的“参数”。一定要把它标记为期末考试。

我使用以下实现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;
    }
}