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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Handler的一个图片轮播程序

發布時間:2023/11/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Handler的一个图片轮播程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 Handler是什么?
* Handler:用來更新UI(主線程)的一套機制,也是一套消息處理機制,我們可以發送信息,也可以通過它來處理消息。
* 比如最常見的Activity的生命周期:它的回調方法都是通過Handler機制去發送消息的,根據不同的Message來做相應的分支處理。
2 為什么要使用Handler?
* 因為android在設計的時候就封裝了一套消息創建,傳遞,處理機制,如果不遵循這樣的機制就沒有辦法來跟新UI的信息,就會拋出異常。(不能在一個非UI線程中跟新UI)。
* 一個Handler實例其實綁定了一個關聯的thread線程和這個線程的message queue;handler會將message和runnable對象發送到它所關聯的message queue中去, 同時它也會執行從message queue中出來的message和runnable。
* 3 handler的四種使用的方法:
* sendMessage
* sendMessageDelayed
* post(Runnable)
* postDelayed(Runnable,long)
*


圖片輪播
MainActivity.class

public class MainActivity extends AppCompatActivity {private ImageView imageView;private Handler handler = new Handler();private int Images[] = {R.drawable.imga, R.drawable.imgb, R.drawable.imgc};private int index;//索引,指示照片的位置private MyRunnable myRunnable = new MyRunnable();//創建一個Runnable對象/*** 創建一個Runnable*/class MyRunnable implements Runnable {@Overridepublic void run() {index++;index = index % 3;imageView.setImageResource(Images[index]);//讓ImageView設置輪播的圖片handler.postDelayed(myRunnable, 1000);//每隔1秒去執行myRunnable方法,不斷輪播圖片,第一個參數是要執行的Runnable對象}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView) findViewById(R.id.iv_picture);handler.postDelayed(myRunnable, 1000);} }

4 sendMessage方法

//需要Handler的Message方法private Handler handler = new Handler() { //重寫HandleMessage來接收消息,怎么發送一個消息?要在Created方法里面new 出一個線程在里面發送消息@Overridepublic void handleMessage(Message msg) {textView.setText(" " + msg.arg1+ " --- "+msg.arg2);//更新TextView里面的文字super.handleMessage(msg);}};

在onCreate方法里面創建一個線程:

new Thread() {@Overridepublic void run() {try {Thread.sleep(2000);//要發送消息,那就要先創建一個MessageMessage message = new Message();message.arg1 =88;message.arg2 =888;handler.sendMessage(message);//調用Handler的sendMessage方法來發送消息給handleMessage來處理消息} catch (InterruptedException e) {e.printStackTrace();}super.run();}}.start();//不要忘記調用start方法,否者線程里面的run方法不會執行

調用Message的obj方法來發送比較多的數據,來發送Message的數據載體:
現在內部創建一個Person類:

//創建一個Person類class Person {public int age;public String name;//調用toString方法輸出name 和age@Overridepublic String toString() {return "name=" + name + "age=" + age;}}

然后在線程里面new一個Person對象:

new Thread() {@Overridepublic void run() {try {Thread.sleep(2000);//要發送消息,那就要先創建一個MessageMessage message = new Message();Person person = new Person();person.age = 22;person.name = "xiaoxjxoaxm";message.obj = person;//調用Message的obi方法來接收person的信息handler.sendMessage(message);//調用Handler的sendMessage方法來發送消息給handleMessage來處理消息} catch (InterruptedException e) {e.printStackTrace();}super.run();}}.start();

更新TextView里面的數據:

private Handler handler = new Handler() {//重寫HandleMessage來接收消息,怎么發送一個消息?要在Created方法里面new 出一個線程在里面發送消息@Overridepublic void handleMessage(Message msg) {textView.setText(" " + msg.obj);//更新TextView里面的文字super.handleMessage(msg);}};

有時候不要創建一個Message對象,直接調用系統的Message的obtainMessage()方法

new Thread() {@Overridepublic void run() {try {Thread.sleep(2000);//有時候不必創建一個Message對象,而是調用系統的Message對象Message message=handler.obtainMessage();//獲取Message對象Person person = new Person();person.age = 22;person.name = "xiaoxjxoaxm";message.obj = person;//調用Message的obi方法來接收person的信息handler.sendMessage(message);//調用Handler的sendMessage方法來發送消息給handleMessage來處理消息} catch (InterruptedException e) {e.printStackTrace();}super.run();}}.start();

有時候不調用 handler.sendMessage(message)來發送消息,還可以調用 message.sendToTarget()來發送消息。target就是一個Handler,它其實就是調用sendMessage來發送消息。

handler.removeCallbacks();//里面傳入一個Runnable對象,來移除消息

new Handler(Callback )的時候里面的那個回調方法的作用就是,方便handler內部信息的攔截(當這個消息符合我們的攔截的對象),當callback的handlerMessage方法的返回值為true的時候,handler本身的那個handlerMessage方法將得不到回調的信息,所以第二個handlerMessage方法并不會執行。如果那個返回值為false的話,第二個方法就會得到執行。

private Handler handler=new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {Toast.makeText(getApplicationContext(),""+2,Toast.LENGTH_SHORT).show();return false;}}){@Overridepublic void handleMessage(Message msg) {Toast.makeText(getApplicationContext(),""+1,Toast.LENGTH_SHORT).show();}};

轉載于:https://www.cnblogs.com/linewman/p/9918401.html

總結

以上是生活随笔為你收集整理的Handler的一个图片轮播程序的全部內容,希望文章能夠幫你解決所遇到的問題。

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