Android / java初学者语法问题

时间:2011-08-01 14:00:38

标签: java android

所以我正在观看教程,我正在尝试理解这种语法

  Thread thread = new Thread()
    {     
  //if i declare variables here i get errors
            public void run()
            {
            // ....define variables in function
           }
    }

此代码如何工作?我认为在创建线程对象时,它定义了向函数“列表”添加或“附加”函数?因此可以稍后调用thread.run()或thread.start()。我不确定我在猜猜。有人可以启发我。从我在run函数中观看的教程中他做了这个

//the same run that is in the Thread class
public void run()
{
  int timer = 0 ;
  while(timer < 5000)
  {
     sleep(100) ; 
     timer+=100;
  }
}

睡觉做什么?我用谷歌搜索它但找不到任何好的东西。在继续循环之前,它是否基本上停止当前应用程序100毫秒?睡眠被称为50次?我在数学上很糟糕大声笑..但如果是这样的话,上面的代码是否等同于

public void run()
{
  int timer = 0 ;
  while(timer < 50)
  {
     sleep(100) ; 
     timer++;
  }
}

但是我知道最简单的方法就是说睡眠(5000);

显然,我是一个菜鸟。所以我会感激任何解释......彻底的更好的谢谢。对不起,不知道如何使用代码标签..

4 个答案:

答案 0 :(得分:8)

它不可能,因为它就像在非

的实例中尝试放置实例变量一样

可能..我们只为单个实例提供实现..而且你不能拥有

专门为单个Object定义的实例变量.. sleep(100)停止执行

当前线程100毫秒,它发生了50次..这意味着50 * 100毫秒..

答案 1 :(得分:1)

ntc给出了一个很好的答案,但线程并不总是最好的方式。查看AsyncTask。

答案 2 :(得分:1)

您在第一个发布的代码示例中看到的是匿名类。这是一个small example,这里是explanation on techartifact

简单地说,这可以让你创建一些扩展某个类的对象(Thread,在你的示例中)。你没有命名这个类,这意味着你将无法在代码的其他部分使用这个相同的类。

通常,您选择的父类有一些必须实现的方法。在您的示例中,您必须实现run()。完成后,您将拥有一个行为与您定义的对象,而无需创建专用类或“命名”inner class

这与创建另一个扩展Thread并执行Thread thread = new MyThreadBehaviour();的类具有相同的行为。

方法run可以完成你的工作,我更喜欢你的代码!

可能有理由在100毫秒的时间内将线程休眠50次。例如,如果您同时运行多个线程,则在较短时间内停止多次将导致与长时间停止它们不同的行为。

答案 3 :(得分:1)

您正在使用匿名类的语法。基本上你是在同时定义和创建一个Thread子类的实例。 run方法覆盖Thread中的run方法,因此新的Thread对象使用run方法。定义Thread类,以便在调用Thread.start()时,它将启动创建线程所需的步骤,并将开始执行run方法。

如果您需要一个不可重用的简单类(如示例或事件侦听器),则匿名类非常有用。这些类型的类可能是特定于上下文的,并且只会在您需要它的地方使用,因此最好在要使用它的位置简洁地定义和实例化该类,而不是明确定义一个名为子类,然后创建该子类的实例。