有没有办法将参数传递给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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java 使用runnable将参数传递给线程

有没有办法将多个参数传递给jquery函数[重复]

有没有办法避免将所有参数传递给函数[重复]

有没有办法将参数传递给 google bigquery 以在其“IN”函数中使用

有没有办法在 CodeIgniter *不*使用 ActiveRecord 的情况下将参数传递给查询?

有没有办法将命令行参数传递给自定义入口点(C / C ++)