2017-06-02 62 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異常