有没有办法将参数传递给Runnable? [复制]
Posted
技术标签:
【中文标题】有没有办法将参数传递给Runnable? [复制]【英文标题】:Is there a way to pass parameters to a Runnable? [duplicate] 【发布时间】:2012-02-25 18:04:55 【问题描述】:我有一个使用处理程序发布可运行实例的线程。它工作得很好,但我很好奇我将如何传递参数以在 Runnable 实例中使用?也许我只是不明白这个功能是如何工作的。
为了抢占“你为什么需要这个”的问题,我有一个线程动画,它必须回调 UI 线程来告诉它实际绘制什么。
【问题讨论】:
【参考方案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);
【讨论】:
我喜欢这种方法,但是我如何从我的计时器线程内部与这个类进行通信(Runnable 在主 UI 线程中)。在将 Runnable 传递给处理程序之前,我可以只公开成员并将其设置在我的计时器线程中吗?看起来好得令人难以置信:) 抱歉回复晚了,编辑了我的答案。 出于某种原因,我认为如果 obj 是在 UI 线程以外的某个地方创建的,那么当它尝试操作视图(在主线程中)时,应用程序将崩溃。我会试一试,非常感谢。 如果您想操作或使视图无效,您可以使用runOnUiThread()
或使用 Handler 在 UI 线程上使视图无效。
现在有单个参数的消费者。【参考方案2】:
有多种方法可以做到这一点,但最简单的方法如下:
final int param1 = value1;
final int param2 = value2;
... new Runnable()
public void run()
// use param1 and param2 here
【讨论】:
我想我应该指定我想避免在我的类中以这种方式使用全局参数... :) 谢谢,但我真的想获得一种传递参数的方法在或使用其他一些结构(如果 Runnable 没有) 您可以将它们作为字段存储在 Runnable 中,仅此而已。你也可以使用 Callable。 在 Runnable 处理第一个帖子之前调用第二个帖子时会遇到同步问题。【参考方案3】:如果您需要将信息传递到Runnable
,您始终可以让Runnable
对象构造函数接收此信息,或者可以在Runnable
上使用其他方法来获取此信息,或者(如果Runnable
是匿名内部类)可以声明适当的值final
以便Runnable
可以访问它们。
希望这会有所帮助!
【讨论】:
Callable 是否可以从不是 UI 线程的线程运行?我开始这样做的原因是,如果要更改任何 UI 元素,就不能只调用 android 中的主线程。 @Dr.Dredel- 是的,任何线程都应该能够运行 Callable。 +1 用于使用匿名类扩展Runnable
并引用 final
变量,只要它只用于一个地方
-1 表示 Callable 接受参数。 Callable 返回结果,但调用方法签名不接受参数。
@JohnSums 你是对的!让我去解决它。【参考方案4】:
虽然你可以使用上面的任何一个答案,但是如果你的问题是真的关心android那么你也可以使用AsyncTask。
【讨论】:
AsyncTask 可以在 UI 线程中操作视图(我知道这仅在 Android 中相关)?【参考方案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
);
【讨论】:
除非MyRunnable
没有扩展Runnable
,因此您将无法在需要Runnable
的地方使用它。
@assylias 如果需要,接口可以扩展可运行。
是的,但这不是问题。通常您调用new Thread(new MyRunnable() ...);
,但这将调用run()
方法,而不是run(int data);
方法。除非你有run
方法调用run(int data)
方法,但是你如何传递参数呢?尝试将您的提案与真实示例一起使用,您会发现问题。
@assylias 我正在使用我的建议,但使用我编写的方法,所以我可以致电run(data)
。我猜你对操作系统方法是正确的,它只会调用run()
。
@ilomambo 接受的答案是正确的方法。由于提问者问题的性质(传递带有要在另一个线程中执行的参数的 Runnable),这个答案根本不起作用。以上是关于有没有办法将参数传递给Runnable? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将参数传递给 google bigquery 以在其“IN”函数中使用