android學習之Handler實現非同步與多線程

來源:互聯網
上載者:User

簡而言之一些比較耗時的操作不要在主線程中等待,而是實現非同步載入,比如那些下載的操作,如果檔案小,網速快,可能一下也完了。。要是檔案大了,網速不給力,勢必拖垮主線程,使用者體驗也差。於是android中使用handler來處理這些事情。 xml中定義兩個button: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >     <TextView        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="@string/hello" />        <Button          android:id="@+id/start"         android:layout_height="wrap_content"         android:layout_width="fill_parent"         android:text="@string/start"     />     <Button          android:id="@+id/stop"         android:layout_height="wrap_content"         android:layout_width="fill_parent"         android:text="@string/stop"     />  </LinearLayout> HanderActivity.java繼承自Activity.java package com.myandroid.handler; import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button; public class HanderActivity extends Activity {    /** Called when the activity is first created. */        Button startButton = null;         Button endButton = null;         Handler handler = new Handler();         /** Called when the activity is first created. */         @Override         public void onCreate(Bundle savedInstanceState) {             super.onCreate(savedInstanceState);             setContentView(R.layout.main);             startButton = (Button)findViewById(R.id.start);             startButton.setOnClickListener(new StartListener());             endButton = (Button)findViewById(R.id.stop);             endButton.setOnClickListener(new EndListener());             System.out.println(Thread.currentThread());        }                  class StartListener implements OnClickListener{                  @Override             public void onClick(View arg0) {                 // TODO Auto-generated method stub                 handler.post(HandlerThread);             }                      }                  class EndListener implements OnClickListener{             @Override             public void onClick(View arg0) {                 // TODO Auto-generated method stub                 handler.removeCallbacks(HandlerThread);             }                      }          //匿名內部類一個線程        Runnable HandlerThread = new Runnable() {                          @Override             public void run() {                 // TODO Auto-generated method stub                 System.out.println("HandlerThread is Running......");                 System.out.println(Thread.currentThread());                handler.postDelayed(HandlerThread, 3000);             }         }; } ①,當start按鈕按下的時候,handler會通過執行代碼handler.post(HandlerThread)把HandlerThread線程加入到handler的線程隊列中,執行線程的run()方法, ②,在run()方法中,handler.postDelayed(HandlerThread, 3000)再次將線程放入handler隊列,設定延時3000ms,這樣是整個線程每個3000ms列印出:HandlerThread is Running...... ③但是,在這裡其實還是在一個線程裡面,通過 System.out.println(Thread.currentThread())的輸出結果可以看出都是主線程 2,要實現handler非同步 1,Message類  每個訊息都有一個隊列,隊列中存放的就是Message對象,obtainMessage()來獲得訊息對象。同時,Message對象是用來傳遞使用的,它能傳遞兩個整型和一個Object,盡量使用Message的arg1與arg2兩個整型來傳遞參數,那樣系統消耗最小(API如是說),如果傳遞資料量比較大,則可以使用setData(Bundle a)的方法,其中的Bundle對象可以粗略的看成是一個Map對象,但它的Key都是String,而value是有限的一些類型,可以再API裡查看。 2,Looper類 Looper能夠迴圈滴從訊息佇列中取得訊息,一般通過thread的getLooper()方法獲得一個Looper對象 package com.myandroid.handler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message;  public class MessageLooperHandler extends Activity {     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);         System.out.println("Activity---->"+Thread.currentThread().getName());       //建立一個HandlerThread對象,它是一個線程         HandlerThread handlerThread = new HandlerThread("HandlerThread");      //啟動線程         handlerThread.start();      //建立一個MyHandler對象,該對象繼承了Handler,從下面的MyHandler類中可以看到,      //調用的是Handler父類的Handler(Looper looper)的建構函式,而這裡傳進去的Looper對象是從HandlerThread中取得的。        MyHandler myHandler = new MyHandler(handlerThread.getLooper());      //獲得訊息對象         Message msg = myHandler.obtainMessage();      //把得到的訊息對象發送給產生該訊息的Handler,即myHandler,      //當myHandler接收到訊息後,就會調用其handleMessage的方法來處理訊息         msg.sendToTarget();    }          class MyHandler extends Handler{         public MyHandler() {//建構函式             // TODO Auto-generated constructor stub         }                  public MyHandler(Looper looper){//建構函式             super(looper);//實現了父類的該建構函式         }                //當這個Handler接收到Message對象的時候,會自動調用這個方法,來對Message對象進行處理         @Override         public void handleMessage(Message msg) {            // TODO Auto-generated method stub             System.out.println("Handler---->"+Thread.currentThread().getName());         }     } }  這時運行MessageLooperHandler這個Activity可以看到:是兩個線程了  實現與主線程的分離,從而可以實現多線程和非同步處理。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.