淺析 - Android異步操作

尊重每個人的付出,轉載請點這裏:http://blog.csdn.net/hanj456/article/details/52347976

異步操作

要點:理解thread,handle,runnable,message,looper的作用以及它們之間的關係。

    什麼是異步操作?簡單來說就是在主線程中新開線程進行的操作;
    爲什麼需要異步操作?大家知道Android設計的時候是不允許在UiThread之外進行UI操作的,同時也不允許在主線程內執行耗時操作,但是這些都是開發中經常會遇到的問題,那麼怎麼解決這一點呢?這就涉及到下面提到的幾個概念:
    thread:android中線程的意思,它是CPU調度資源的基本單位,執行所有的動作 ;
    runnable:一個接口,裏面只有一個抽象方法run();
    message:android中的消息處理機制中的一員,用來傳遞數據;
    looper:專門用來操作操作message的,它和主線程是相互綁定的;
    handle:可以把它理解爲子線程和Looper之間的橋樑;
    弄清楚這幾個概念就不難發現Android是怎麼完成主線程只負責UI操作,子線程負責耗時操作的分工的:首先當主線程MainThread中需要進行耗時操作的時候新開一條子線程childThread,而childThread的操作是在runnable接口中run()方法裏實現的,完成之後需要將結果傳遞到主線程,這時候想到了Looper和message,但使用它們需要藉助handle這個橋樑,於是我們就通過handle來操作Looper將子線程中的數據封裝到message中傳遞到主線程了。

使用示例:

Handle handle = new Handle();
new Thread(new Runnable(){
  @Override
    public void run() {
        final Bitmap bitmap = downloadImage(imageUrl);
        handle.post(new Runnable(){
            public void run() {
              mIv.setImageBitmap(bitmap);
            }
        });
    }
}).start();

以上是異步操作的一個基本思路,像Android提供的runOnUiThread()方法其實就是講handle這一步進行了封裝,簡化了一點操作步驟。但是這個方法還有一些缺陷,那就是如果只是一兩個子線程沒問題,但如果是需要新開一百條線程,那系統就喫不消了,爲了解決所線程任務的需求,就引出一個新的概念:線程池(ThreadPool)。

什麼是線程池?簡單來說就是對線程的一個封裝,線程池中由多個線程,當一個線程使用完後就放回線程池中,後面再次需要這個線程的時候重新取出來進行利用,避免了重複創建線程帶來的額外開銷,也方便了線程的統一管理。對於這種多線程的異步任務操作,Android爲我們提供了一個封裝好了線程池的類AsyncTask,將創建線程池和對線程池的管理過程都封裝起來,我們只需要在onPostExecute()方法中執行對UI的操作,在doInBackground()方法中執行耗時操作就行,結構很簡單。

使用示例:

 new AsyncTask<String,Void,Bitmap>(){
            @Override
            protected Bitmap doInBackground(String... params) {
                return downloadImage(params[0]);
            }

            @Override
            protected void onPostExecute(Bitmap bitmap) {
                mIv.setImageBitmap(bitmap);
            }
        }.execute(imageUrl);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章