說明:本系列文章是從《有心課堂》中”谷歌的小弟”之《深入探討Android異步精髓Handler》教程整理。 Handler是Android中對消息的一種處理機制,處理說到底是對數據的處理,特別是在多線程中,我們要保證各個線程中的數據不相互干涉就要用到ThreadLocal類。 ThreadLocal類是不同線程的數據副本。我們可以舉例說明。人都有很多身份,就以我做例子,在公司是職員,回到家是兒子,在女朋友面前是男朋友。下面寫個程序來詢問身份。
PRivate String mString; //身份記錄private String res1, res2, res3; //幾個場景:公司、家、女朋友面前寫兩個線程詢問本人的身份。
/** * 我在公司 */private class Thread01 extends Thread{ @Override public void run() { setString("我是職員"); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } res1 = getString(); }}/** * 我在家 */private class Thread02 extends Thread{ @Override public void run() { setString("我是兒子"); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } res2 = getString(); }}現在來打印身份:
public class ThreadLocalActivity01 extends Activity{ private String mString; private String res1, res2, res3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); askWhoAreYou(); } private void askWhoAreYou(){ new Thread01().start(); new Thread02().start(); setString("我是男朋友"); res3 = getString(); try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } Log.i("我在公司", res1); Log.i("我在家", res2); Log.i("我在女朋友面前", res3); } public void setString(String string) { mString = string; } public String getString() { return mString; }}運行看看角色: 
幾次運行結果不相同,角色亂了,所以需要用ThreadLocal來解決此類問題。
我們首先創建一個ThreadLocal的對象,在每個場景(線程)中設置自己的身份。
通過源碼我們可以很清晰看到身份設置時會利用場景(即當前線程)做Map的Key,這樣就保證了每個線程對應的Key不同所以值互不影響。在多線程的情況,就是靠著這樣的實現保證不同線程中處理的消息互不影響。
新聞熱點
疑難解答