Android入門之Handler的使用教程詳解
簡介
我們在前面的Android教程中已經(jīng)提到過這么一件事:Android在啟動后會有一個主線程。它不允許任何子線程去改變主UI線程里的內(nèi)容。
這么做是為了妨止,萬一有一個帶有大事務的線程導致了渲染組件時間過長最終導致Android UI出現(xiàn)“閃退”、“崩潰”的保護機制。
而實際我們在Android操作里的確是會有一些“耗時”的事情而采用異步線程,如:首頁打開時調(diào)用第三方地圖定位API、調(diào)用第三方銀行API來顯示你的余額、調(diào)用第三方社保顯示你的當前社保繳納費用和額度。
這種加載我們都會使用異步,一旦異步加載完后拿到結(jié)果再“刷新”在我們的主界面的控件里。那么此時由于Android的保護機制就不可以直接在異步線程里一個set()就完事了。
因此Android給我們提供了Handler機制。
Handler我們可以認為它是一個和Android主進程間的通道。
當異步任務、子任務等需要改變主UI線程里的控件的渲染、值、顯示用變化,那么我們就通過Handler發(fā)一條消息。
當主線程Listener到了消息,然后就可以去做相應的值的改變和渲染了。
我們?yōu)榱顺浞终f明這個問題我們用一個ImageView,然后在里面每隔X毫秒,換一個圖片從而實現(xiàn)下面這樣的一個“動畫”效果來說明Android里的Handler的使用方法。
項目結(jié)構(gòu)
項目結(jié)構(gòu)很簡單,只有8個圖,這8個圖是8個楨。每X毫秒在原來的圖位置上換一個圖,然后滾播,以到達“動畫”效果。
我把這8楨圖給出,供各位自己去練習吧。
代碼
前端
<?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]); } } } }
代碼導讀
我們使用的是ImageView里的setImageResource來輪換圖片做到動畫效果;
我們使用了Handler,在Handler.handleMessage里來換ImageView里的圖;
然后我們使用了一個Timer()的schedule線程,以每100毫秒向Handler發(fā)一個emptyMessage(101)這樣的一個消息給到Handler的Listener,所以在handleMessage方法中如果what==101就“飛”。
最終就實現(xiàn)了這樣的一個效果了
到此這篇關(guān)于Android入門之Handler的使用教程詳解的文章就介紹到這了,更多相關(guān)Android Handler內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android中HttpURLConnection與HttpClient的使用與封裝
這篇文章主要介紹了Android中HttpURLConnection與HttpClient的使用以及封裝方法,感興趣的小伙伴們可以參考一下2016-03-03Android 自定義SeekBar 實現(xiàn)分段顯示不同背景顏色的示例代碼
這篇文章主要介紹了Android 自定義SeekBar 實現(xiàn)分段顯示不同背景顏色,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06Android實現(xiàn)圓形ProgressBar停止轉(zhuǎn)動的方法詳解
這篇文章主要為大家詳細介紹了Android實現(xiàn)圓形ProgressBar停止轉(zhuǎn)動方法的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-03-03Android開發(fā)實現(xiàn)自動切換文字TextSwitcher功能示例
這篇文章主要介紹了Android開發(fā)實現(xiàn)自動切換文字TextSwitcher功能,結(jié)合實例形式詳細分析了Android使用TextSwitcher實現(xiàn)文字自動切換的原理、實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-03-03