运行一个参数?
我需要一个“接受参数的Runnable”,但我知道这样的runnable并不存在。
这可能表明我的应用程序devise中的根本缺陷和/或疲倦的大脑中的精神障碍,所以我希望在这里find一些关于如何完成如下内容的build议, 而不违反基本的OO原则:
private Runnable mOneShotTask = new Runnable(String str) { public void run(String str) { someFunc(str); } };
任何想法如何完成上面的东西?
你可以在方法中声明一个类
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(); }
你可以把它放在一个函数中。
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作为ID – > 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));
创buildinit函数,返回对象本身并用它初始化参数。
我使用下面的类来实现Runnable接口。 有了这个类,你可以很容易地创build带有参数的新线程
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; } }
你有两个select:
-
定义一个命名的类。 将你的parameter passing给指定类的构造函数。
-
让你的匿名classclosures你的“参数”。 一定要把它标记为
final
。
我首先想知道你在这里想要完成什么,需要一个parameter passing给新的Runnable()或run()。 通常的方法应该是在启动之前通过设置成员variables来让一个Runnable对象将数据(str)传递给它的线程。 run()方法然后使用这些成员variables值来执行someFunc()