編輯:關於Android編程
Handler的使用(二)
一、 Handler與線程的關系
Handler在默認情況下,實際上它和調用它的Activity是處於同一個線程的。
例如在Handler的使用(一)的示例1中,雖然聲明了線程對象,但是在實際調用當中它並沒有調用線程的start()方法,而是直接調用當前線程的run()方法。
通過一個例子來證實一下
示例1:一個Android應用程序,在Activity中創建Handler和線程對象,並且在Activity的onCreate()方法中輸出當前線程的id和名字,然後在線程對象的run方法中也打印輸出下當前線程的id和名字。如果說,Activity輸出的結果與線程對象輸出的結果是一樣的,那麼就表示它們使用的是同一個線程。
下面是Activity代碼:
package android.handler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; public class HandlerTwo extends Activity { /** Called when the activity is first created. */ Handler handler = new Handler(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在設置布局文件之前先調用post方法, //表示在執行完線程之後才會顯示布局文件中的內容,而線程中又設置了休眠10秒鐘, //所以最終效果為,先顯示應用程序主界面,等待10秒鐘之後才顯示布局文件中的內容 handler.post(r); setContentView(R.layout.main); System.out.println("activity id--->"+Thread.currentThread().getId()); System.out.println("activity name--->"+Thread.currentThread().getName()); } Runnable r = new Runnable(){ public void run() { //輸出當前線程的id和name //如果這裡輸出的線程id、name與上面onCreate()方法中輸出的線程id、name相同的話, //那麼則表示,他們使用的是同一個線程 System.out.println("runnable_id--->"+Thread.currentThread().getId()); System.out.println("runnable_name--->"+Thread.currentThread().getName()); try{ Thread.sleep(10000); //讓線程休眠10秒 }catch(InterruptedException e){ e.printStackTrace(); } } }; }
下圖是執行的結果:
根據結果可以看出,兩個輸出的id和name都相同,它們使用的是同一個線程。
現在將Activity中的代碼修改一下,新建一個線程Thread,然後調用線程的start()方法,再觀察一下控制台的輸出結果。
這裡只要將上面的代碼稍微修改一下就可以了
1、先將handler.post(r)注釋掉
2、再添加下面兩句代碼就OK了 <喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgo8L3A+CjxwPjxwcmUgY2xhc3M9"brush:java;"> //handler.post(r);
Thread t = new Thread(r);
t.start();
輸出結果:
從這個輸出結果中可以看出,這次線程對象的id、name與activity裡的線程id、name完全不一樣了,由此可見,它們現在使用的不是同一個線程。
這個例子中還掩飾了一個效果,就是平時我們是將Handler的post()方法放在setContentView(R.layout.main)這個方法之後調用,將設置完布局之後再執行其他的操作,而在這個例子中,是將Handler的post()方法放在setContent()方法之前調用,而post裡傳遞的線程對象的run()方法呢,又執行了休眠線程10秒鐘,所以運行實現的效果會是,當程序運行後,首先Activity上沒有任何內容,過來10秒之後,才會顯示Activity裡的內容。
二、 Bundle和如何在新線程中處理消息
首先介紹一下Bundle:
Bundle它是一個以string為鍵,可以由其他數據類型作為值的一個mapping,相當於把數據當成一個包。在初學的階段可以將它當成特殊的一個HashMap對象,不過HashMap的鍵和值都是Object類型的,而Bundle的鍵卻是String類型。
通過一個例子來使用一下Bundle和如何在新線程中處理消息
示例2:一個Android應用程序,先打印Activity當前使用的線程id,然後再創建一個新線程,使用Bundl存儲值,最後打印出線程的id和Bundle中存儲的值。
看一下輸出結果:
通過兩張圖對比,,不難發現布局異常!看代碼 android:layout_hei
前言之前,我們介紹了下拉刷新上拉加載RecyclerView的使用,那麼現在,我們就來說一下這個下拉刷新是怎麼實現的。在開發過程中,我想了兩種方案。一是使用LinearL
最近公司沒事,研究了下多嵌套滾動組件的事件分發,雖然以前也接觸過,但都是拿網上的用,也是特別簡單的,正好朋友也需要,就研究了下。這個Demo也不是很完善,放上來也是讓各位
有時候我們需要監聽ScroView的滑動情況,比如滑動了多少距離,是否滑到布局的頂部或者底部。可惜的是SDK並沒有相應的方法,不過倒是提供了一個protected voi