說明:本系列文章是從《有心課堂》中”谷歌的小弟”之《深入探討Android異步精髓Handler》教程整理。 Handler是Android中對(duì)消息的一種處理機(jī)制,處理說到底是對(duì)數(shù)據(jù)的處理,特別是在多線程中,我們要保證各個(gè)線程中的數(shù)據(jù)不相互干涉就要用到ThreadLocal類。 ThreadLocal類是不同線程的數(shù)據(jù)副本。我們可以舉例說明。人都有很多身份,就以我做例子,在公司是職員,回到家是兒子,在女朋友面前是男朋友。下面寫個(gè)程序來詢問身份。
PRivate String mString; //身份記錄private String res1, res2, res3; //幾個(gè)場(chǎng)景:公司、家、女朋友面前寫兩個(gè)線程詢問本人的身份。
/** * 我在公司 */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(); }}現(xiàn)在來打印身份:
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; }}運(yùn)行看看角色: 
幾次運(yùn)行結(jié)果不相同,角色亂了,所以需要用ThreadLocal來解決此類問題。
我們首先創(chuàng)建一個(gè)ThreadLocal的對(duì)象,在每個(gè)場(chǎng)景(線程)中設(shè)置自己的身份。
通過源碼我們可以很清晰看到身份設(shè)置時(shí)會(huì)利用場(chǎng)景(即當(dāng)前線程)做Map的Key,這樣就保證了每個(gè)線程對(duì)應(yīng)的Key不同所以值互不影響。在多線程的情況,就是靠著這樣的實(shí)現(xiàn)保證不同線程中處理的消息互不影響。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注