-
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal為解決多線程程序的并發問題提供了一種新的思路。使用這個工具類可以很簡潔地編寫出優美的多線程程序。 ThreadLocal很容易讓人望文生義,想當然地認為是一個“本地線程”。其實,ThreadLocal并不是一個Thread,而是Thread的局部變量,也許把它命名為ThreadLocalVariable更容易讓人理解一些。 當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立地改變自己的副本,而不會影響其它線程所對應的副本。 從線程的角度看,目標變量就象是線程的本地變量,這也是類名中“Local”所要表達的意思。查看全部
-
在非ui線程中如果讓線程休眠,那么就不能更新ui,如果不讓線程休眠,又可以更新ui,原因我們可以從源碼的角度去觀察,但是不建議使用,最好還是通過使用handler的機制來實現對ui的更新查看全部
-
更新ui的四種方法: 第一種: private void handle1(){ handler.post(new Runnbale(){ public void run(){ textView.setText("ok"); } }); } 第二種:直接在子線程中使用sendMessage,在創建handler對象的時候,在其中的handleMessage方法中去更新ui private void handler2(){ handler.sendEmptyMessage(1); } 第三種: private void handler3(){ runOnUiThread(new Runnable(){ public void run(){ textView.setText("ok"); } }) } 第四種: private void viewUi(){ textView.post(new Runnable(){ public void run(){ textView.setText("ok"); } }) }查看全部
-
重點: handler負責發送消息,Looper負責接收handler發送的消息,并直接把消息回傳給handler自己,MessageQueue就是一個存儲消息的容器查看全部
-
google為什么只設計了handler來解決更新ui的問題? 最根本的目的就是解決多線程并發問題,假設如果在一個Activity當中,有多個線程去更新ui,并且都沒有加鎖機制,那么就會出現更新界面錯亂,但是如果都進行加鎖處理的話,又會導致性能下降 因此,產生了這種handler的更新機制,根本不用去關心多線程的問題,所有的更新ui的操作,都是在主線程的消息隊列當中去輪詢處理的查看全部
-
通過 handler來實現sendMessage的方法的步驟: 1.創建一個handler的對象,并在其中重寫handlerMessage的方法,并在其中更新ui private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { extView.setText("" + msg.arg1);};}; 2.創建一個Thread類,在其中的run()方法中初始化一個message,并為message來賦值,并調用handler的sendMessage的方法 new Thread() { public void run() { try { Thread.sleep(2000); Message message = new Message(); message.arg1 = 88; handler.sendMessage(message); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; 這樣,執行這個線程的時候就會通過sendMessage的方法將message參數傳遞過去,并在上面的初始化handler的時候接受到參數,并實現更新ui查看全部
-
通過handler來實現圖片定時輪播的代碼: public class MainActivity extends Activity { private Handler handler = new Handler(); private ImageView imageView; // 將我們保存在文件夾中的三張圖片進行了實例化 private int[] images = { R.drawable.image1, R.drawable.image2, R.drawable.image3 }; // 創建的下標,用來實現當前是哪張圖片顯示 private int index; // 創建了一個我們自己寫的Runnable的對象 private MyRunnable myRunnbale = new MyRunnable(); class MyRunnable implements Runnable { @Override public void run() { // TODO Auto-generated method stub index++; index = index % 3; imageView.setImageResource(images[index]); // 通過handler的postDelayed的方法,進行定時的執行run方法中的代碼 handler.postDelayed(myRunnbale, 1000); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView1); imageView = (ImageView) findViewById(R.id.imageView1); // 在主線程中執行上面的操作 handler.postDelayed(myRunnbale, 1000); } }查看全部
-
handler的四種使用的方法: sendMessage sendMessageDelayed post(Runnable) postDelayed(Runnable,long)查看全部
-
new Thread() { public void run() { try { Thread.sleep(1000); handler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub // 更新文本信息 // 此時直接在這里更新ui的時候,程序將會直接崩潰掉 textView.setText("更新了"); } }); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; }.start(); 從上面的方法中我們可以知道,如果想直接更新ui,我們需要在Thread的run方法中通過 handler.post()的方法來實現,而post方法中的參數是一個new Runnable(){public void run(){} ,然后我們在這個run方法中去更新ui,這才是正確的方法查看全部
-
說明:如果我們直接在一個Activity中new一個Thread,并在其中的run方法中去更新ui,那么此時這個程序是會直接崩潰掉的,也就是說,我們不能直接在非ui線程中去更新ui,需要使用到Handler的機制才能實現我們的效果:查看全部
-
為什么需要使用handler: Android在設計的時候,就封裝了一套消息創建,傳遞,處理機制,如果不遵循這樣的機制的話,就沒有辦法更新ui信息,也就是不使用handler會拋出異常消息查看全部
-
什么是handler: handler是android給我們提供用來更新UI的一套機制,也是一套消息處理的機制,我們可以發送消息,也可以通過它來處理消息查看全部
-
handler 負責發送消息, looper負責接收handler發送的消息,并直接把消息回傳給handler自己。MessageQueue就是一個存儲消息的容器查看全部
-
handler是android給我們提供用來更新UI的一套機制,也是一套消息處理的機制,我們可以發送消息,也可以通過它處理消息查看全部
-
為什么要用handler?查看全部
舉報
0/150
提交
取消