【问题标题】:Creating a runnable that uses parameters创建使用参数的可运行文件
【发布时间】:2013-05-06 23:41:05
【问题描述】:

我正在做一些 Android 编程,我想创建一个接受意图的可运行文件。我了解创建可运行文件的一般方法是:

Runnable R1 = new Runnable(){ 代码 };

我想要的是让我的 runnable 接受一个意图作为参数或输入。然后,runnable 将意图用于其他目的。我想我会看起来像这样:

Runnable R1 = new Runnable(Intent i1){ 代码 };

我已经尝试过这个及其变体,但无法编译。我该怎么做?

【问题讨论】:

  • 那么如何创建新类型呢?

标签: java constructor instance declaration runnable


【解决方案1】:

要接受参数,必须创建一个符合 Runnable 的新类,以便可以将参数传递给构造函数(并在其中有用地使用)。另一种对匿名 Runnable 对象有用的捕获状态的方法是访问词法范围内的final 变量。

使用一个新类和一个接受参数并存储值供以后使用的构造函数:

class RoadRunner implements Runnable {
   String acmeWidget;
   public RoadRunner (string acmeWidget) {
     this.acmeWidget = acmeWidget;
   }
   public void run () {
     evadeCleverPlan(acmeWidget);
   }
}

void doIt () {
  Runnable r = new RoadRunner("Fast Rocket");
  // do something with runnable
}

(如果RoadRunnerinner class - 这是一个非静态嵌套类 - 它也可以访问封闭类型的实例成员。)

使用匿名 Runnable 和“穷人的封闭”:

void doItAnon () {
  final String acmeWidget = "TNT";
  Runnable r = new Runnable () {
    public void run () {
      evadeCleverPlan(acmeWidget);
    }
  };
  // do something with runnable
}

(这个匿名 Runnable也可以访问包含类型的实例成员,因为 anonymous classes 是内部类。)

【讨论】:

  • 对不起,我不是程序员。我很难理解该代码。两个sn-ps的代码都可以完成任务还是第一部分的第二部分?
  • 它们是两种不同的方法,可以根据情况使用。我会推荐第一种方法,因为它通常可以更清晰地分离关注点(第二种方法通常最适合动作处理程序之类的东西)。我建议遵循 Java Trail 链接 - 了解如何声明新类是能够使用 Java 的重要部分。
  • 嘿,所以我已经实施了您的第一个解决方案,但我认为这里存在误解。我希望能够创建一个可运行对象,然后将其传递给不同的意图,但是此解决方案要求我在创建可运行对象时指定意图。我有 4 个意图,但我不想为这 4 个意图创建 4 个可运行文件。
  • @jizcoBorneo Runnables 做同样的事情还是做不同的事情?如果他们做同样的事情,请考虑将代码移动到非内部类(即在它自己的 .java 文件中)并为 4 个意图中的每一个使用相同的 Runnable 类。这样做的时候,如果Runnable代码需要访问Intention,将Intention作为参数传递给Runnable的构造函数,并作为实例变量存储起来以备后用(一定要妥善处理Intention生命周期)。如果 Runnable 做不同的事情,那么它们应该是不同的类。
【解决方案2】:

这个问题的答案取决于你是想在构造 Runnable 时传入 Intent,还是在调用 run 时传入 Intent。对于前一种情况,user2246674 提供了一个很好的答案。

但是,如果您想执行后者,您将需要创建一个看起来有点像 Runnable 但不是的界面。

public interface RunnableWithIntent {
  void run(Intent intent);
}

然后你会像这样实例化你的“可运行”接口:

RunnableWithIntent r = new RunnableWithIntent() {
  public void run(Intent intent) {
    // do something with the intent
  }
};

然后这样称呼它:

Intent intent = ...
r.run(intent);

请注意,此类不能用于任何使用常规 Runnable 对象的地方。它只是遵循类似的使用模式。

【讨论】:

  • 所以我不能将它与 handler.postdelayed 一起使用?
  • 不,因为在这种情况下你没有调用它 - postDelayed 处理程序正在调用它,它不会知道你的 Intent 参数的任何信息。您需要使用 user2246674 建议的技术:创建一个 Runnable 子类,并在构造时将 Intent 参数传递给它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
相关资源
最近更新 更多