Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發之Handler的使用

Android開發之Handler的使用

編輯:關於Android編程

Handler用來接收子線程發送的消息,並根據此數據來更新主程序中的UI;當主線程中的操作比較耗時,就需要把耗時的操作放到子線程中。在Android中,如果主線程在5s內沒有響應的話,就會彈“強制關閉”的提示框;     在布局文件中定義一個ImageView   [html]  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"       xmlns:tools="http://schemas.android.com/tools"       android:layout_width="match_parent"       android:layout_height="match_parent"       tools:context=".MainActivity" >          <ImageView           android:id="@+id/imageView"           android:layout_width="match_parent"           android:layout_height="match_parent"           android:contentDescription="@string/description" />      </RelativeLayout>     在線程中隨機生成一個數,更新imageView ,在Handler中可以處理多個子線程發過來的數據,通過what變量來區分。   [java]   package com.example.handlerdemo;      import java.util.Random;      import android.app.Activity;   import android.os.Bundle;   import android.os.Handler;   import android.os.Looper;   import android.os.Message;   import android.widget.ImageView;      /**   * 實現在線程中隨機改變當前ImageView 在線程中以消息方式通知Handle更新主線程中的UI   *    * @author Administrator   *    */   public class MainActivity extends Activity {          private static final int UPDATE_PIC = 0x100;       private static final int UPDATE_DATA = 0x101;       private ImageView imageView = null;       private MyHandler handler = null;       private UpdateThread updateThread = null;       private int[] path = new int[] { R.drawable.psb1, R.drawable.psb2,               R.drawable.psb3, R.drawable.psb4, R.drawable.psb5, R.drawable.psb6 };       private String[] names;          @Override       protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           setContentView(R.layout.main);           names = getResources().getStringArray(R.array.arrays); // 獲取數組資源           imageView = (ImageView) findViewById(R.id.imageView);           handler = new MyHandler();           myThread t = new myThread();           Thread m = new Thread(t);           m.start(); // 開啟線程           updateThread = new UpdateThread();           handler.post(updateThread);       }          /**       * 接受消息和處理消息 ,此Handler會與當前主線程一塊運行       *        * @author Administrator       *        */       private class MyHandler extends Handler {           public MyHandler() {              }              public MyHandler(Looper looper) {               super(looper);           }              /**           * 接收數據           */           @Override           public void handleMessage(Message msg) {               if (msg.what == UPDATE_PIC) {                   // 此處可以更新UI                   imageView.setImageResource(path[msg.arg1]);                   setTitle(msg.getData().getString("name"));               }                else if(msg.what == UPDATE_DATA){                   System.out.println("data = " + msg.arg1);               }               else {                   super.handleMessage(msg);               }           }       }          /**       * 實現隨機更新圖片,並通知Handler更新圖片       *        * @author Administrator       *        */       private class myThread implements Runnable {              @Override           public void run() {               // TODO Auto-generated method stub               int index = 0; // 保存產生的隨機數               // 如果線程沒有發生中斷,就一直執行               while (!Thread.currentThread().isInterrupted()) {                   index = new Random().nextInt(path.length); // 產生一個小於length的隨機整數                   Message message = handler.obtainMessage(); // 獲取一個Message                   //用arg1、arg2傳遞消息,對系統資源消耗少                   message.arg1 = index; // 保存要顯示的索引                   message.what = UPDATE_PIC; // 設置消息標識                   Bundle bundle = new Bundle(); // 獲取Bundle對象    存放數據                   bundle.putString("name", names[index]); // 保存標題                   message.setData(bundle); // 將Bundle對象保存到Message                   handler.sendMessage(message); // 向Handler發送消息,更新UI                   try {                       Thread.sleep(2000);                   } catch (InterruptedException e) {                       // TODO Auto-generated catch block                       e.printStackTrace();                   }               }           }       }              private class UpdateThread implements Runnable{              int index = 0;           @Override           public void run() {               // TODO Auto-generated method stub               index++;               Message message = handler.obtainMessage(); // 獲取一個Message               //用arg1、arg2傳遞消息,對系統資源消耗少               message.arg1 = index; // 保存要顯示的索引               message.what = UPDATE_DATA; // 設置消息標識               handler.sendMessage(message);                handler.postDelayed(updateThread, 3000);           }                  }              @Override       protected void onDestroy() {           // TODO Auto-generated method stub           handler.removeCallbacks(updateThread);           super.onDestroy();       }   }    
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved