日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Android Handler的使用(二)

發布時間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Handler的使用(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Handler的使用(二)

? ?? ? 一、 Handler與線程的關系

? ?? ? Handler在默認情況下,實際上它和調用它的Activity是處于同一個線程的。
例如在Handler的使用(一)的示例1中,雖然聲明了線程對象,但是在實際調用當中它并沒有調用線程的start()方法,而是直接調用當前線程的run()方法。

? ?? ? 通過一個例子來證實一下

? ?? ? 示例1:一個Android應用程序,在Activity中創建Handler和線程對象,并且在Activity的onCreate()方法中輸出當前線程的id和名字,然后在線程對象的run方法中也打印輸出下當前線程的id和名字。如果說,Activity輸出的結果與線程對象輸出的結果是一樣的,那么就表示它們使用的是同一個線程。
下面是Activity代碼: package?eoe.demo;?

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了

//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中存儲的值。
看一下輸出結果:





轉載于:https://www.cnblogs.com/zziss/archive/2012/02/14/2351955.html

總結

以上是生活随笔為你收集整理的Android Handler的使用(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。