Android入門(mén)之Handler的使用教程詳解
簡(jiǎn)介
我們?cè)谇懊娴腁ndroid教程中已經(jīng)提到過(guò)這么一件事:Android在啟動(dòng)后會(huì)有一個(gè)主線程。它不允許任何子線程去改變主UI線程里的內(nèi)容。
這么做是為了妨止,萬(wàn)一有一個(gè)帶有大事務(wù)的線程導(dǎo)致了渲染組件時(shí)間過(guò)長(zhǎng)最終導(dǎo)致Android UI出現(xiàn)“閃退”、“崩潰”的保護(hù)機(jī)制。
而實(shí)際我們?cè)贏ndroid操作里的確是會(huì)有一些“耗時(shí)”的事情而采用異步線程,如:首頁(yè)打開(kāi)時(shí)調(diào)用第三方地圖定位API、調(diào)用第三方銀行API來(lái)顯示你的余額、調(diào)用第三方社保顯示你的當(dāng)前社保繳納費(fèi)用和額度。
這種加載我們都會(huì)使用異步,一旦異步加載完后拿到結(jié)果再“刷新”在我們的主界面的控件里。那么此時(shí)由于Android的保護(hù)機(jī)制就不可以直接在異步線程里一個(gè)set()就完事了。
因此Android給我們提供了Handler機(jī)制。
Handler我們可以認(rèn)為它是一個(gè)和Android主進(jìn)程間的通道。
當(dāng)異步任務(wù)、子任務(wù)等需要改變主UI線程里的控件的渲染、值、顯示用變化,那么我們就通過(guò)Handler發(fā)一條消息。
當(dāng)主線程Listener到了消息,然后就可以去做相應(yīng)的值的改變和渲染了。
我們?yōu)榱顺浞终f(shuō)明這個(gè)問(wèn)題我們用一個(gè)ImageView,然后在里面每隔X毫秒,換一個(gè)圖片從而實(shí)現(xiàn)下面這樣的一個(gè)“動(dòng)畫(huà)”效果來(lái)說(shuō)明Android里的Handler的使用方法。
項(xiàng)目結(jié)構(gòu)
項(xiàng)目結(jié)構(gòu)很簡(jiǎn)單,只有8個(gè)圖,這8個(gè)圖是8個(gè)楨。每X毫秒在原來(lái)的圖位置上換一個(gè)圖,然后滾播,以到達(dá)“動(dòng)畫(huà)”效果。
我把這8楨圖給出,供各位自己去練習(xí)吧。
代碼
前端
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/RelativeLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" tools:context="org.mk.android.demohandlerwithanim.MainActivity" > <ImageView android:id="@+id/imgAnimation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> </RelativeLayout>
后端
package org.mk.android.demohandlerwithanim; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.ImageView; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity { int imgids[] = new int[]{R.drawable.a_1, R.drawable.a_2, R.drawable.a_3, R.drawable.a_4, R.drawable.a_5, R.drawable.a_6, R.drawable.a_7, R.drawable.a_8}; int imgstart = 0; ImageView imgAnimation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imgAnimation = findViewById(R.id.imgAnimation); Handler imgAnimationHandler = new ImgAnimatonHandler(); new Timer().schedule(new TimerTask() { @Override public void run() { imgAnimationHandler.sendEmptyMessage(101); } }, 0, 100); } class ImgAnimatonHandler extends Handler { @Override public void handleMessage(Message msg) { if (msg.what == 101) { imgAnimation.setImageResource(imgids[imgstart++ % 8]); } } } }
代碼導(dǎo)讀
我們使用的是ImageView里的setImageResource來(lái)輪換圖片做到動(dòng)畫(huà)效果;
我們使用了Handler,在Handler.handleMessage里來(lái)?yè)QImageView里的圖;
然后我們使用了一個(gè)Timer()的schedule線程,以每100毫秒向Handler發(fā)一個(gè)emptyMessage(101)這樣的一個(gè)消息給到Handler的Listener,所以在handleMessage方法中如果what==101就“飛”。
最終就實(shí)現(xiàn)了這樣的一個(gè)效果了
到此這篇關(guān)于Android入門(mén)之Handler的使用教程詳解的文章就介紹到這了,更多相關(guān)Android Handler內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android中HttpURLConnection與HttpClient的使用與封裝
這篇文章主要介紹了Android中HttpURLConnection與HttpClient的使用以及封裝方法,感興趣的小伙伴們可以參考一下2016-03-03Android 自定義SeekBar 實(shí)現(xiàn)分段顯示不同背景顏色的示例代碼
這篇文章主要介紹了Android 自定義SeekBar 實(shí)現(xiàn)分段顯示不同背景顏色,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Android實(shí)現(xiàn)圓形ProgressBar停止轉(zhuǎn)動(dòng)的方法詳解
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圓形ProgressBar停止轉(zhuǎn)動(dòng)方法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03Android開(kāi)發(fā)實(shí)現(xiàn)自動(dòng)切換文字TextSwitcher功能示例
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)自動(dòng)切換文字TextSwitcher功能,結(jié)合實(shí)例形式詳細(xì)分析了Android使用TextSwitcher實(shí)現(xiàn)文字自動(dòng)切換的原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-03-03Android 實(shí)現(xiàn)自定義圓形進(jìn)度條的功能
這篇文章主要介紹了Android 實(shí)現(xiàn)自定義圓形進(jìn)度條的功能的相關(guān)資料,開(kāi)發(fā)Android應(yīng)用的朋友肯定對(duì)自定義View不陌生,很多都有重新寫(xiě)的,這里就對(duì)實(shí)現(xiàn)圓形進(jìn)度條介紹下,需要的朋友可以參考下2016-11-11Android編程之菜單的實(shí)現(xiàn)方法實(shí)例詳解
這篇文章主要介紹了Android編程之菜單的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了上下文菜單、選項(xiàng)菜單和子菜單的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-11-11