欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

android主線程,android主線程等待

每個Android 都應必須了解的多線程知識點~

進程是系統(tǒng)調(diào)度和資源分配的一個獨立單位。

創(chuàng)新互聯(lián)公司專注于慶元網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供慶元營銷型網(wǎng)站建設,慶元網(wǎng)站制作、慶元網(wǎng)頁設計、慶元網(wǎng)站官網(wǎng)定制、成都微信小程序服務,打造慶元網(wǎng)絡公司原創(chuàng)品牌,更為您提供慶元網(wǎng)站排名全網(wǎng)營銷落地服務。

在Android中,一個應用程序就是一個獨立的集成,應用運行在一個獨立的環(huán)境中,可以避免其他應用程序/進程的干擾。當我們啟動一個應用程序時,系統(tǒng)就會創(chuàng)建一個進程(該進程是從Zygote中fork出來的,有獨立的ID),接著為這個進程創(chuàng)建一個主線程,然后就可以運行MainActivity了,應用程序的組件默認都是運行在其進程中。開發(fā)者可以通過設置應用的組件的運行進程,在清單文件中給組件設置:android:process = "進程名";可以達到讓組件運行在不同進程中的目的。讓組件運行在不同的進程中,既有好處,也有壞處。我們依次的說明下。

好處:每一個應用程序(也就是每一個進程)都會有一個內(nèi)存預算,所有運行在這個進程中的程序使用的總內(nèi)存不能超過這個值,讓組件運行不同的進程中,可以讓主進程可以擁有更多的空間資源。當我們的應用程序比較大,需要的內(nèi)存資源比較多時(也就是用戶會抱怨應用經(jīng)常出現(xiàn)OutOfMemory時),可以考慮使用多進程。

壞處:每個進程都會有自己的虛擬機實例,因此讓在進程間共享一些數(shù)據(jù)變得相對困難,需要采用進程間的通信來實現(xiàn)數(shù)據(jù)的共享。

線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。

在Android中,線程會有那么幾種狀態(tài):創(chuàng)建、就緒、運行、阻塞、結(jié)束。當應用程序有組件在運行時,UI線程是處于運行狀態(tài)的。默認情況下,應用的所有組件的操作都是在UI線程里完成的,包括響應用戶的操作(觸摸,點擊等),組件生命周期方法的調(diào)用,UI的更新等。因此如果UI線程處理阻塞狀態(tài)時(在線程里做一些耗時的操作,如網(wǎng)絡連接等),就會不能響應各種操作,如果阻塞時間達到5秒,就會讓程序處于ANR(application not response)狀態(tài)。

1.線程作用

減少程序在并發(fā)執(zhí)行時所付出的時空開銷,提高操作系統(tǒng)的并發(fā)性能。

2.線程分類

守護線程、非守護線程(用戶線程)

2.1 守護線程

定義:守護用戶線程的線程,即在程序運行時為其他線程提供一種通用服務

常見:如垃圾回收線程

設置方式:thread.setDaemon(true);//設置該線程為守護線程

2.2 非守護線程(用戶線程)

主線程 子線程。

2.2.1 主線程(UI線程)

定義:Android系統(tǒng)在程序啟動時會自動啟動一條主線程

作用:處理四大組件與用戶進行交互的事情(如UI、界面交互相關(guān))

因為用戶隨時會與界面發(fā)生交互,因此主線程任何時候都必須保持很高的響應速度,所以主線程不允許進行耗時操作,否則會出現(xiàn)ANR。

2.2.2 子線程(工作線程)

定義:手動創(chuàng)建的線程

作用:耗時的操作(網(wǎng)絡請求、I/O操作等)

2.3 守護線程與非守護線程的區(qū)別和聯(lián)系

區(qū)別:虛擬機是否已退出,即

a. 當所有用戶線程結(jié)束時,因為沒有守護的必要,所以守護線程也會終止,虛擬機也同樣退出

b. 反過來,只要任何用戶線程還在運行,守護線程就不會終止,虛擬機就不會退出

3.線程優(yōu)先級

3.1 表示

線程優(yōu)先級分為10個級別,分別用Thread類常量表示。

3.2 設置

通過方法setPriority(int grade)進行優(yōu)先級設置,默認線程優(yōu)先級是5,即 Thread.NORM_PRIORITY。

4.線程狀態(tài)

創(chuàng)建狀態(tài):當用 new 操作符創(chuàng)建一個線程的時候

就緒狀態(tài):調(diào)用 start 方法,處于就緒狀態(tài)的線程并不一定馬上就會執(zhí)行 run 方法,還需要等待CPU的調(diào)度

運行狀態(tài):CPU 開始調(diào)度線程,并開始執(zhí)行 run 方法

阻塞(掛起)狀態(tài):線程的執(zhí)行過程中由于一些原因進入阻塞狀態(tài),比如:調(diào)用 sleep/wait 方法、嘗試去得到一個鎖等

結(jié)束(消亡)狀態(tài):run 方法執(zhí)行完 或者 執(zhí)行過程中遇到了一個異常

(1)start()和run()的區(qū)別

通過調(diào)用Thread類的start()方法來啟動一個線程,這時此線程是處于就緒狀態(tài),并沒有運行。調(diào)用Thread類調(diào)用run()方法來完成其運行操作的,方法run()稱為線程體,它包含了要執(zhí)行的這個線程的內(nèi)容,run()運行結(jié)束,此線程終止,然后CPU再調(diào)度其它線程。

(2)sleep()、wait()、yield()的區(qū)別

sleep()方法屬于Thread類,wait()方法屬于Object類。

調(diào)用sleep()方法,線程不會釋放對象鎖,只是暫停執(zhí)行指定的時間,會自動恢復運行狀態(tài);調(diào)用wait()方法,線程會放棄對象鎖,進入等待此對象的等待鎖定池,不調(diào)用notify()方法,線程永遠處于就緒(掛起)狀態(tài)。

yield()直接由運行狀態(tài)跳回就緒狀態(tài),表示退讓線程,讓出CPU,讓CPU調(diào)度器重新調(diào)度。禮讓可能成功,也可能不成功,也就是說,回到調(diào)度器和其他線程進行公平競爭。

1.Android線程的原則

(1)為什么不能再主線程中做耗時操作

防止ANR, 不能在UI主線程中做耗時的操作,因此我們可以把耗時的操作放在另一個工作線程中去做。操作完成后,再通知UI主線程做出相應的響應。這就需要掌握線程間通信的方式了。 在Android中提供了兩種線程間的通信方式:一種是AsyncTask機制,另一種是Handler機制。

(2)為什么不能在非UI線程中更新UI 因為Android的UI線程是非線程安全的,應用更新UI,是調(diào)用invalidate()方法來實現(xiàn)界面的重繪,而invalidate()方法是非線程安全的,也就是說當我們在非UI線程來更新UI時,可能會有其他的線程或UI線程也在更新UI,這就會導致界面更新的不同步。因此我們不能在非UI主線程中做更新UI的操作。

2.Android實現(xiàn)多線程的幾種方式

3.為何需要多線程

多線程的本質(zhì)就是異步處理,直觀一點說就是不要讓用戶感覺到“很卡”。

4.多線程機制的核心是啥

多線程核心機制是Handler

推薦Handler講解視頻: 面試總被問到Handler?帶你從源碼的角度解讀Handler核心機制

根據(jù)上方提到的 多進程、多線程、Handler 問題,我整理了一套 Binder與Handler 機制解析的學習文檔,提供給大家進行學習參考,有需要的可以 點擊這里直接獲?。。?! 里面記錄許多Android 相關(guān)學習知識點。

android 主線程和子線程有什么區(qū)別

本文較為深入的分析了android中UI主線程與子線程。分享給大家供大家參考。具體如下:

在一個Android 程序開始運行的時候,會單獨啟動一個Process。默認的情況下,所有這個程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的兩種,除此之外還有Content Provider和Broadcast Receiver)都會跑在這個Process。

一個Android 程序默認情況下也只有一個Process,但一個Process下卻可以有許多個Thread。在這么多Thread當中,有一個Thread,我們稱之為UI Thread。UI Thread在Android程序運行的時候就被創(chuàng)建,是一個Process當中的主線程Main Thread,主要是負責控制UI界面的顯示、更新和控件交互。在Android程序創(chuàng)建之初,一個Process呈現(xiàn)的是單線程模型,所有的任務都在一個線程中運行。因此,我們認為,UI Thread所執(zhí)行的每一個函數(shù),所花費的時間都應該是越短越好。而其他比較費時的工作(訪問網(wǎng)絡,下載數(shù)據(jù),查詢數(shù)據(jù)庫等),都應該交由子線程去執(zhí)行,以免阻塞主線程。

那么,UI Thread如何和其他Thread一起工作呢?常用方法是:誕生一個主線程的Handler物件,當做Listener去讓子線程能將訊息Push到主線程的Message Quene里,以便觸發(fā)主線程的handlerMessage()函數(shù),讓主線程知道子線程的狀態(tài),并在主線程更新UI。

例如,在子線程的狀態(tài)發(fā)生變化時,我們需要更新UI。如果在子線程中直接更新UI,通常會拋出下面的異常:

11-07 13:33:04.393: ERROR/JavaBinder(1029):android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.

意思是,無法在子線程中更新UI。為此,我們需要通過Handler物件,通知主線程Ui Thread來更新界面。

如下,首先創(chuàng)建一個Handler,來監(jiān)聽Message的事件:

private final int UPDATE_UI = 1;

private Handler mHandler = new MainHandler();

private class MainHandler extends Handler {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case UPDATE_UI: {

Log.i("TTSDeamon", "UPDATE_UI");

showTextView.setText(editText.getText().toString());

ShowAnimation();

break;

}

default:

break;

}

}

}

或者:

private Handler mHandler = new Handler(){

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case UPDATE_UI: {

Log.i("TTSDeamon", "UPDATE_UI");

showTextView.setText(editText.getText().toString());

ShowAnimation();

break;

}

default:

break;

}

}

}

當子線程的狀態(tài)發(fā)生變化,則在子線程中發(fā)出Message,通知更新UI。

mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);

在我們的程序中,很多Callback方法有時候并不是運行在主線程當中的,所以如果在Callback方法中更新UI失敗,也可以采用上面的方法。

Android UI線程

思考:

先必須了解下面2個問題

1.顧名思義 UI線程 就是刷新UI 所在線程

2.UI是單線程刷新

1.對Activity 來說 UI線程就是其主線程

2.對View來說 UI線程就是創(chuàng)建ViewRootImpl所在的線程

可以通過 WindowManager 內(nèi)部會創(chuàng)建ViewRootImpl對象

好了,進入主題。我們來慢慢揭開面紗。

我們可以分別從幾個方面切入

我們可能都有使用過 runOnUiThread 現(xiàn)在來看看的源碼實現(xiàn)。

可以從上面的源碼 看到

不是UI線程 就用Handler切到Handler所在的線程中,如果是UI線程直接就調(diào)用run方法。

Activity的創(chuàng)建:

1.Activity創(chuàng)建:mInstrumentation.newActivity

2.創(chuàng)建Context :ContextImpl appContextcreateBaseContextForActivity(r)

我們經(jīng)常用這個方法干的事情就是,要么在onCreate中獲取View寬高的值。要么就是在子線程中做一些耗時操作 ,然后post切到對應View所在的線程 來繪制UI操作。那么這個對應的線程就是UI線程了。

那么這個UI線程就一定是主線程嗎?

接來繼續(xù)來看。它的源碼View:post

mAttachInfo 在dispatchAttachedToWindow 中被賦值 ,也就是在ViewRootImpl創(chuàng)建的時候,所以是創(chuàng)建ViewRootImpl所在的線程。

attachInfo 上面時候為null 呢?在ViewRootImpl 還沒來得及創(chuàng)建的時候,ViewRootImpl 創(chuàng)建是在 “onResume" 之后。所以在 Activity 的 onCreate 去View.post 那么AttachInfo 是為null 。

當 AttachInfo == null 那么會調(diào)用 getRunQueue().post(action) 。

最終這個Runnable 被 緩存到 HandlerActionQueue 中。

直到ViewRootImpl 的 performTraversals 中 調(diào)用dispatchAttachedToWindow(mAttachInfo, 0);, 那么才會去處理 RunQueue() 中的Runnable。

來張圖 便于理解這個流程

我們有時候去子線程操作UI的時候(如:requestLayout),會很經(jīng)常見到下面的 報錯日志:

Only the original thread that created a view hierarchy can touch its views

為什么會報這個錯誤呢?

翻譯一下:只有創(chuàng)建視圖層次結(jié)構(gòu)的原始線程才能接觸到它的視圖。

也就是操作UI的線程要和ViewRootImpl創(chuàng)建的線程是同一個線程才行,并不是只有主線程才能更新UI啊。

ViewRootImpl創(chuàng)建的線程?那么 ViewRootImpl 在哪里被創(chuàng)建的呢?

從上圖可以看到ViewRootImpl創(chuàng)建最開始是從 ActivityThread 的HandleResumeActivity中開始 一直 ViewRootImpl 創(chuàng)建,也就是說ViewRootImpl 對應的UI線程和 ActivityThread 在同一個線程 也就是主線程。

好了 通過上面的講解,上面的問題相信你可以自己回答啦~

Android線程池的使用

在Android中有主線程和子線程的區(qū)分。主線程又稱為UI線程,主要是處理一些和界面相關(guān)的事情,而子線程主要是用于處理一些耗時比較大的一些任務,例如一些網(wǎng)絡操作,IO請求等。如果在主線程中處理這些耗時的任務,則有可能會出現(xiàn)ANR現(xiàn)象(App直接卡死)。

線程池,從名字的表明含義上我們知道線程池就是包含線程的一個池子,它起到新建線程、管理線程、調(diào)度線程等作用。

既然Android中已經(jīng)有了線程的概念,那么為什么需要使用線程池呢?我們從兩個方面給出使用線程池的原因。

在Android中線程池就是ThreadPoolExecutor對象。我們先來看一下ThreadPoolExecutor的構(gòu)造函數(shù)。

我們分別說一下當前的幾個參數(shù)的含義:

第一個參數(shù)corePoolSize為 核心線程數(shù) ,也就是說線程池中至少有這么多的線程,即使存在的這些線程沒有執(zhí)行任務。但是有一個例外就是,如果在線程池中設置了allowCoreThreadTimeOut為true,那么在 超時時間(keepAliveTime) 到達后核心線程也會被銷毀。

第二個參數(shù)maximumPoolSize為 線程池中的最大線程數(shù) 。當活動線程數(shù)達到這個數(shù)后,后續(xù)添加的新任務會被阻塞。

第三個參數(shù)keepAliveTime為 線程的?;顣r間 ,就是說如果線程池中有多于核心線程數(shù)的線程,那么在線程沒有任務的那一刻起開始計時,如果超過了keepAliveTime,還沒有新的任務過來,則該線程就要被銷毀。同時如果設置了allowCoreThreadTimeOut為true,該時間也就是上面第一條所說的 超時時間 。

第四個參數(shù)unit為 第三個參數(shù)的計時單位 ,有毫秒、秒等。

第五個參數(shù)workQueue為 線程池中的任務隊列 ,該隊列持有由execute方法傳遞過來的Runnable對象(Runnable對象就是一個任務)。這個任務隊列的類型是BlockQueue類型,也就是阻塞隊列,當隊列的任務數(shù)為0時,取任務的操作會被阻塞;當隊列的任務數(shù)滿了(活動線程達到了最大線程數(shù)),添加操作就會阻塞。

第六個參數(shù)threadFactory為 線程工廠 ,當線程池需要創(chuàng)建一個新線程時,使用線程工廠來給線程池提供一個線程。

第七個參數(shù)handler為 拒絕策略 ,當線程池使用有界隊列時(也就是第五個參數(shù)),如果隊列滿了,任務添加到線程池的時候的一個拒絕策略。

可以看到FixedThreadPool的構(gòu)建調(diào)用了ThreadPoolExecutor的構(gòu)造函數(shù)。從上面的調(diào)用中可以看出FixedThreadPool的幾個特點:

可以看到CacheThreadPool的構(gòu)建調(diào)用了ThreadPoolExecutor的構(gòu)造函數(shù)。從上面的調(diào)用中可以看出CacheThreadPool的幾個特點:

可以看到ScheduledThreadPoolExecutor的構(gòu)建調(diào)用了ThreadPoolExecutor的構(gòu)造函數(shù)。從上面的調(diào)用中可以看出ScheduledThreadPoolExecutor的幾個特點:

可以看到SingleThreadExecutor的構(gòu)建調(diào)用了ThreadPoolExecutor的構(gòu)造函數(shù)。從上面的調(diào)用中可以看出SingleThreadExecutor的幾個特點:

Android開發(fā)之路-多線程

多線程作為Android開發(fā)中相對而言較為高階的知識,其中用到相關(guān)的知識點是非常的多,所以在我們需要進行設計或者寫多線程的代碼就必須要進行相對謹慎的處理,這樣就由必要對其要有著比較系統(tǒng)化的認知

我們一般將Android應用分成為兩種:主線程和工作線程;主線程主要是用來進行初始化UI,而工作線程主要是進行耗時操作,例如讀取數(shù)據(jù)庫,網(wǎng)絡連接等

Android系統(tǒng)是以進程為單位來對應用程序資源進行限制,這個問題的可以解釋為:一個進程最多能夠開幾個線程?最好能開幾個?但實則這個是沒有上限這一說,主要是因為資源的限制

Android中關(guān)于主線程的理解:Android的主線程是UI線程,在Android中,四大組件運行在主線程中,在主線程中做耗時操作會導致程序出現(xiàn)卡頓甚至出現(xiàn)ANR異常,一個.

在一個程序中,這些獨立運行的程序片斷叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理”。多線程處理一個常見的例子就是用戶界面。

線程總的來就是進程的一個實體,是CPU進行分派和調(diào)度的基本單位,擁有著比進程更小且能夠獨立運行的基本單位,線程本身基本上是不擁有系統(tǒng)資源,僅擁有一點在運行過程中必須擁有的資源,但它可與同屬一個進程中的其他進程進行共享其所擁有的所有資源

線程狀態(tài)有些地方將之分為5中狀態(tài),而且在Java Jdk中線程被其定義為6中狀態(tài),我們可以對其進行類比

普遍定義的5中狀態(tài):新建,就緒,運行,阻塞, 死亡

Java Jdk 定義狀態(tài)

線程阻塞是指在某一時刻的某一個線程在進行運行一段代碼的情況下,突然另一個線程也要進行運行,但在運行過程中,那個線程執(zhí)行完全運行之前,另一個線程是不可能獲取到CPU的執(zhí)行權(quán),就會導致線路阻塞的出現(xiàn)

死鎖也稱之為抱死,意思就是說一個進程鎖定了另外一個進程所需要的頁或表是,但第二個進程同時又鎖定了第一個進程所需的一頁,這樣就會出現(xiàn)死鎖現(xiàn)象

簡要介紹實現(xiàn)線程的三種方式:繼承Thread,實現(xiàn)runnable,實現(xiàn)callable。這里有一點需要注意的是,實現(xiàn)callable是與線程池相關(guān)聯(lián)的而callable很重要的一個特性是其帶有返回值。當我們只需實現(xiàn)單線程時實現(xiàn)runnable更加利于線程程序的拓展

在線程開啟之前進行調(diào)用 thread.setDaemon(true); 將thread設定成當前線程中的守護線程 使用案例

線程讓步【yield方法】讓當前線程釋放CPU資源,讓其他線程搶占

這種具體某個對象鎖 wait notify 方法與Condition 的 await以及signal方法類似; 全面這種方法的阻塞等待都可以是釋放鎖,而且在喚醒后,這種線程都是能夠獲取鎖資源的,而這個門栓就跟閥門類似

Android進程間和線程間通信方式

? 進程:是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。

??線程:是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有一些在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。

??區(qū)別:

??(1)、一個程序至少有一個進程,一個進程至少有一個線程;

??(2)、線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高;

??(3)、進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉。

---------------------

一、Android進程間通信方式

1.Bundle

??由于Activity,Service,Receiver都是可以通過Intent來攜帶Bundle傳輸數(shù)據(jù)的,所以我們可以在一個進程中通過Intent將攜帶數(shù)據(jù)的Bundle發(fā)送到另一個進程的組件。

??缺點:無法傳輸Bundle不支持的數(shù)據(jù)類型。

2.ContentProvider

??ContentProvider是Android四大組件之一,以表格的方式來儲存數(shù)據(jù),提供給外界,即Content Provider可以跨進程訪問其他應用程序中的數(shù)據(jù)。用法是繼承ContentProvider,實現(xiàn)onCreate,query,update,insert,delete和getType方法,onCreate是負責創(chuàng)建時做一些初始化的工作,增刪查改的方法就是對數(shù)據(jù)的查詢和修改,getType是返回一個String,表示Uri請求的類型。注冊完后就可以使用ContentResolver去請求指定的Uri。

3.文件

??兩個進程可以到同一個文件去交換數(shù)據(jù),我們不僅可以保存文本文件,還可以將對象持久化到文件,從另一個文件恢復。要注意的是,當并發(fā)讀/寫時可能會出現(xiàn)并發(fā)的問題。

4.Broadcast

??Broadcast可以向android系統(tǒng)中所有應用程序發(fā)送廣播,而需要跨進程通訊的應用程序可以監(jiān)聽這些廣播。

5.AIDL方式

??Service和Content Provider類似,也可以訪問其他應用程序中的數(shù)據(jù),Content Provider返回的是Cursor對象,而Service返回的是Java對象,這種可以跨進程通訊的服務叫AIDL服務。

? ? ?AIDL通過定義服務端暴露的接口,以提供給客戶端來調(diào)用,AIDL使服務器可以并行處理,而Messenger封裝了AIDL之后只能串行運行,所以Messenger一般用作消息傳遞。

6.Messenger

??Messenger是基于AIDL實現(xiàn)的,服務端(被動方)提供一個Service來處理客戶端(主動方)連接,維護一個Handler來創(chuàng)建Messenger,在onBind時返回Messenger的binder。

??雙方用Messenger來發(fā)送數(shù)據(jù),用Handler來處理數(shù)據(jù)。Messenger處理數(shù)據(jù)依靠Handler,所以是串行的,也就是說,Handler接到多個message時,就要排隊依次處理。

7.Socket

??Socket方法是通過網(wǎng)絡來進行數(shù)據(jù)交換,注意的是要在子線程請求,不然會堵塞主線程。客戶端和服務端建立連接之后即可不斷傳輸數(shù)據(jù),比較適合實時的數(shù)據(jù)傳輸

二、Android線程間通信方式

??一般說線程間通信主要是指主線程(也叫UI線程)和子線程之間的通信,主要有以下兩種方式:

1.AsyncTask機制

??AsyncTask,異步任務,也就是說在UI線程運行的時候,可以在后臺的執(zhí)行一些異步的操作;AsyncTask可以很容易且正確地使用UI線程,AsyncTask允許進行后臺操作,并在不顯示使用工作線程或Handler機制的情況下,將結(jié)果反饋給UI線程。但是AsyncTask只能用于短時間的操作(最多幾秒就應該結(jié)束的操作),如果需要長時間運行在后臺,就不適合使用AsyncTask了,只能去使用Java提供的其他API來實現(xiàn)。

2.Handler機制

??Handler,繼承自Object類,用來發(fā)送和處理Message對象或Runnable對象;Handler在創(chuàng)建時會與當前所在的線程的Looper對象相關(guān)聯(lián)(如果當前線程的Looper為空或不存在,則會拋出異常,此時需要在線程中主動調(diào)用Looper.prepare()來創(chuàng)建一個Looper對象)。使用Handler的主要作用就是在后面的過程中發(fā)送和處理Message對象和讓其他的線程完成某一個動作(如在工作線程中通過Handler對象發(fā)送一個Message對象,讓UI線程進行UI的更新,然后UI線程就會在MessageQueue中得到這個Message對象(取出Message對象是由其相關(guān)聯(lián)的Looper對象完成的),并作出相應的響應)。

三、Android兩個子線程之間通信

??面試的過程中,有些面試官可能會問Android子線程之間的通信方式,由于絕大部分程序員主要關(guān)注的是Android主線程和子線程之間的通信,所以這個問題很容易讓人懵逼。

??主線程和子線程之間的通信可以通過主線程中的handler把子線程中的message發(fā)給主線程中的looper,或者,主線程中的handler通過post向looper中發(fā)送一個runnable。但looper默認存在于main線程中,子線程中沒有Looper,該怎么辦呢?其實原理很簡單,把looper綁定到子線程中,并且創(chuàng)建一個handler。在另一個線程中通過這個handler發(fā)送消息,就可以實現(xiàn)子線程之間的通信了。

??子線程創(chuàng)建handler的兩種方式:

??方式一:給子線程創(chuàng)建Looper對象:

new Thread(new Runnable() {

? ? ? ? public void run() {?

? ? ? ? ? ? Looper.prepare();? // 給這個Thread創(chuàng)建Looper對象,一個Thead只有一個Looper對象

? ? ? ? ? ? Handler handler = new Handler(){?

? ? ? ? ? ? ? ? @Override?

? ? ? ? ? ? ? ? public void handleMessage(Message msg) {?

? ? ? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show();?

? ? ? ? ? ? ? ? }?

? ? ? ? ? ? };?

? ? ? ? ? ? handler.sendEmptyMessage(1);?

? ? ? ? ? ? Looper.loop(); // 不斷遍歷MessageQueue中是否有消息

? ? ? ? };?

? ? }).start();

---------------------

? ?方式二:獲取主線程的looper,或者說是UI線程的looper:

new Thread(new Runnable() {

? ? ? ? public void run() {?

? ? ? ? ? ? Handler handler = new Handler(Looper.getMainLooper()){ // 區(qū)別在這!??!?

? ? ? ? ? ? ? ? @Override?

? ? ? ? ? ? ? ? public void handleMessage(Message msg) {?

? ? ? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show();?

? ? ? ? ? ? ? ? }?

? ? ? ? ? ? };?

? ? ? ? ? ? handler.sendEmptyMessage(1);?

? ? ? ? };?

? ? }).start();

---------------------

標題名稱:android主線程,android主線程等待
文章源于:http://chinadenli.net/article24/phjpje.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、定制開發(fā)、營銷型網(wǎng)站建設商城網(wǎng)站、建站公司、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設網(wǎng)站維護公司
国产精品大秀视频日韩精品| 国内九一激情白浆发布| 欧美一本在线免费观看| 精品日韩av一区二区三区| 免费在线播放不卡视频| 欧美在线观看视频三区| 国自产拍偷拍福利精品图片| 99久久国产精品免费| 中文字幕亚洲精品人妻| 一区二区三区在线不卡免费| 国产精品午夜小视频观看| 激情偷拍一区二区三区视频| 久久精品福利在线观看| 99久久精品国产麻豆| 日本免费一区二区三女| 精品亚洲一区二区三区w竹菊| 国产欧美日韩在线精品一二区| 欧美尤物在线视频91| 伊人久久青草地婷婷综合| 亚洲国产性感美女视频| 国产精品一区二区日韩新区| 国产精品欧美激情在线观看| 国产白丝粉嫩av在线免费观看| 日韩夫妻午夜性生活视频| 久久经典一区二区三区| 久久综合狠狠综合久久综合| 国产欧美日产久久婷婷| 小草少妇视频免费看视频| 中文字幕中文字幕在线十八区| 欧美特色特黄一级大黄片| 精品高清美女精品国产区| 日韩成人动作片在线观看| 日韩偷拍精品一区二区三区| 国产成人高清精品尤物| 东京干男人都知道的天堂| 色偷偷偷拍视频在线观看| 人妻熟女欲求不满一区二区| 国产成人精品综合久久久看| 亚洲一区二区精品久久av| 日韩精品一区二区三区射精| 97人妻精品免费一区二区|