2017-06-02 63 views
3

它可能看起来非常滑稽和愚蠢的问题..有花纹图案

我想看看周围的Runnable,线程,服务与Android应用程序意图服务的后台操作混淆。

所以我创建了一个活动,创建活动里面像,

public class ExectuableThread implements Runnable{ 
    @Override 
    public void run() { 
    Log.e("current-thread", String.valueOf(Looper.getMainLooper().isCurrentThread())); // **Returning true** 
    btnDone.setText("will not work"); 
    } 
} 

因此,在上述情况下按钮文本正在改变一个简单的线程。

不要紧,我打电话这样的:

Thread t = new Thread (new ExectuableThread()); 
t.run(); 

OR

Thread t = new Thread (new ExectuableThread()); 
t.start(); 

为什么我的按钮上的文字是,如果通过调用start()改变; - 当使用后台线程?

现在一个非常有趣的场景;如果我这样拖延2秒,

public class ExectuableThread implements Runnable{ 
    @Override 
    public void run() { 
    try { 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    Log.e("current-thread", String.valueOf(Looper.getMainLooper().isCurrentThread())); 
    btnDone.setText("will not work"); 
    } 
} 

然后,如果我调用start(),那么视图没有更新;在run()调用的情况下。它会工作。开始之间

差()和run()是明确的,但问题是相同的,为什么按钮文本正在更新如果线程是在后台。

+0

我认为这将有助于您了解运行之间的差异()和start()方法 HTTP://javarevisited.blogspot 。在/ 2012/03 /差之间的启动和运行,method.html#axzz4ip9wGDe1 – santoXme

+0

@santoXme感谢。这我明白,但会有所帮助如果你能纠正我的问题或回答。:) – Custadian

回答

2

首先,你命名不是太好:

public class ExectuableThread implements Runnable { 

将意味着这个类的实例是线程,但他们当然不是。所以你在那里添加混淆到整个问题。

我的问题是为什么我的按钮文本正在改变,如果通过调用start();线程在后台运行。

事情是:当你不做事情的“正确方法”,特别是在多线程中,各种事情都会发生。

含义:以更新的Android UI元素,你应该使用runOnUiThread。更新其他线程内的UI元素可能工作,或可能无法工作。

+0

对不起,命名和'可执行'拼写;现在开始会记住,但我正在测试虚拟应用程序中的代码。 runOnUiThread工作;我知道runOnUiThread会工作,但仍然很好奇为什么会发生这种情况。 – Custadian

+0

我同意找出这样的事情很有趣,但这是多线程的事情:当你做错了,所有的投注都关闭了。各种各样的事情都可能发生。 – GhostCat

-1

主要区别在于,当程序调用start()方法创建一个新线程,而如果你调用运行在新的线程中执行run()方法()方法直接没有新的线程被创建和内部运行的代码()将在当前的线程上执行。

而第二个区别是,如果你调用start()方法,然后两次将抛出IllegalStateException异常