Android入門之Handler的使用教程詳解
簡介
我們在前面的Android教程中已經(jīng)提到過這么一件事:Android在啟動后會有一個主線程。它不允許任何子線程去改變主UI線程里的內(nèi)容。
這么做是為了妨止,萬一有一個帶有大事務(wù)的線程導(dǎo)致了渲染組件時間過長最終導(dǎo)致Android UI出現(xiàn)“閃退”、“崩潰”的保護(hù)機(jī)制。
而實(shí)際我們在Android操作里的確是會有一些“耗時”的事情而采用異步線程,如:首頁打開時調(diào)用第三方地圖定位API、調(diào)用第三方銀行API來顯示你的余額、調(diào)用第三方社保顯示你的當(dāng)前社保繳納費(fèi)用和額度。
這種加載我們都會使用異步,一旦異步加載完后拿到結(jié)果再“刷新”在我們的主界面的控件里。那么此時由于Android的保護(hù)機(jī)制就不可以直接在異步線程里一個set()就完事了。
因此Android給我們提供了Handler機(jī)制。
Handler我們可以認(rèn)為它是一個和Android主進(jìn)程間的通道。
當(dāng)異步任務(wù)、子任務(wù)等需要改變主UI線程里的控件的渲染、值、顯示用變化,那么我們就通過Handler發(fā)一條消息。
當(dāng)主線程Listener到了消息,然后就可以去做相應(yīng)的值的改變和渲染了。

我們?yōu)榱顺浞终f明這個問題我們用一個ImageView,然后在里面每隔X毫秒,換一個圖片從而實(shí)現(xiàn)下面這樣的一個“動畫”效果來說明Android里的Handler的使用方法。

項(xiàng)目結(jié)構(gòu)

項(xiàng)目結(jié)構(gòu)很簡單,只有8個圖,這8個圖是8個楨。每X毫秒在原來的圖位置上換一個圖,然后滾播,以到達(dá)“動畫”效果。
我把這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來輪換圖片做到動畫效果;
我們使用了Handler,在Handler.handleMessage里來換ImageView里的圖;
然后我們使用了一個Timer()的schedule線程,以每100毫秒向Handler發(fā)一個emptyMessage(101)這樣的一個消息給到Handler的Listener,所以在handleMessage方法中如果what==101就“飛”。
最終就實(shí)現(xiàn)了這樣的一個效果了

到此這篇關(guān)于Android入門之Handler的使用教程詳解的文章就介紹到這了,更多相關(guān)Android Handler內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android自定義View實(shí)現(xiàn)進(jìn)度條動畫
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)進(jìn)度條動畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08
Android4.2中全屏或者取消標(biāo)題欄的方法總結(jié)
有的時候我們會看到,會先出現(xiàn)標(biāo)題欄,然后再消失,因?yàn)槲覀冎皇窃赼ctivity的oncreate方法中定義的,其他實(shí)現(xiàn)方法如下,感興趣的朋友可以了解下哈2013-06-06
android 大圖片拖拽并縮放實(shí)現(xiàn)原理
android 大圖片拖拽縮放有利于用戶體驗(yàn),在開發(fā)過程中經(jīng)常使用到,這篇圖片拖拽縮放也是我在項(xiàng)目中用到的,今天整理一下,將源碼奉獻(xiàn)給大家,希望對大家以后碰到相似的問題有幫助2013-01-01
Android 中build.prop 文件與 getprop 命令
這篇文章主要介紹了Android 中build.prop 文件與 getprop 命令的相關(guān)資料,需要的朋友可以參考下2017-06-06
Android實(shí)現(xiàn)輸入法彈出時把布局頂上去和登錄按鈕頂上去的解決方法
這篇文章主要介紹了Android實(shí)現(xiàn)輸入法彈出時把布局頂上去和登錄按鈕頂上去的解決方法,需要的朋友可以參考下2017-11-11
Android 官推 kotlin-first 的圖片加載庫——Coil的使用入門
這篇文章主要介紹了Android 官推 kotlin-first 的圖片加載庫——Coil的使用入門,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04

