【问题标题】:Not able to understand Runnable in android无法理解Android中的Runnable
【发布时间】:2016-08-21 06:46:31
【问题描述】:

这是我的代码:

public class MainActivity extends AppCompatActivity {

    Runnable runnable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        runnable=new Runnable() {
            @Override
            public void run() {
                Log.i("hello","runnable") ;
            }
        };
    }

}

为什么不打印日志?我需要一个处理程序,然后在其中传递可运行对象吗? run() 方法是否只运行一次?

【问题讨论】:

  • 你没有启动它。调用 new Thread(runnable).start();
  • 您的问题不完整。请先做
  • @P.Rai Runnable 只是一个接口:你不能启动一个接口
  • @pskink,问题不在于界面。问题是关于implements 接口的匿名内部类。 OP 向我们展示了创建实现 Runnable 的匿名类的新实例的代码,但 OP 没有向我们展示任何对该对象执行任何操作的代码。 (即,调用run() 方法的代码在哪里?或者将新的 Runnable 对象交给将调用run() 方法的其他对象的代码在哪里?)
  • @jameslarge 好的,所以它是java.lang.Object,它有一个从Runnable iface 获取的附加方法,但你仍然无法“启动”它

标签: java android multithreading runnable android-handler


【解决方案1】:

目前你只是定义你的可运行文件,但它永远不会被调用。有一些方法可以使用 runnable,例如在线程中或在处理程序中。

这是一个无法更新 UI 的线程示例:

new Thread(runnable).start();

如果您需要更新 UI,您应该使用这样的处理程序:

new Handler().post(runnable); // do as soon as possible
new Handler().postDelayed(runnable, 300); // do it after 300ms

通常它没有意义,但您也可以将 runnable 用作一种回调,如下所示:

runnable.run();

通过多次使用以上三个示例,可以多次使用runnable。

【讨论】:

  • 为什么第三种方式没有意义?这是访问Runnable 接口的正常方式(第一个和第二个选项都这样做)。
  • 可运行对象通常用于线程或处理程序。这会起作用,但通常你不会这样做。最后一次调用是在 Handler 或 Thread 中完成的,换句话说,该调用在框架中使用,通常不在用户代码中。
  • Re,“通常它没有意义,但是......” 使用Runnable 作为回调使 lot 有意义。但是,使它成为回调的是 runnable.run() 调用发生在创建 Runnable 对象的某个 other 方法(可能在其他一些类中)中。
  • 恕我直言,使用 Runnable 作为回调没有意义。更好地创建一个自定义接口,使接口调用的作用更加清晰。如果您暂时忽略参数,则可以使用 Runnable 而不是 View.OnClickListener。但是我想你会同意我的观点,即使用一个告诉你做什么的界面会更好。如果你想有多个回调,它也更有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多