首頁 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測 / 活動(dòng)區(qū)

交流區(qū) | 測硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門 / 進(jìn)階 / 社區(qū)互助

新手 | 你問我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 11964|回復(fù): 0
上一主題 下一主題
[教程]

第二十七講:Handler使用入門

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:19 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1790
本講內(nèi)容:Handler使用入門
當(dāng)用戶點(diǎn)擊一個(gè)按鈕時(shí)如果執(zhí)行的是一個(gè)常耗時(shí)操作的話,處理不好會(huì)導(dǎo)致系統(tǒng)假死,用戶體驗(yàn)很差,而Android則更進(jìn)一步,如果任意一個(gè)Acitivity沒有響應(yīng)5秒鐘以上就會(huì)被強(qiáng)制關(guān)閉,因此我們需要另外起動(dòng)一個(gè)線程來處理長耗時(shí)操作,而主線程則不受其影響,在耗時(shí)操作完結(jié)發(fā)送消息給主線程,主線程再做相應(yīng)處理。那么線程之間的消息傳遞和異步處理用的就是Handler。
下面我們通過一個(gè)模擬文件下載的這個(gè)長耗時(shí)操作來做個(gè)說明:
1、新建一個(gè)項(xiàng)目 Lesson27_Handler
2、在MainHandler.java中寫如下面內(nèi)容:
   
  1. package android.basic.lesson27;   
       
    import android.app.Activity;   
    import android.app.ProgressDialog;   
    import android.content.res.Resources;   
    import android.os.Bundle;   
    import android.os.Handler;   
    import android.os.Message;   
    import android.util.Log;   
    import android.view.View;   
    import android.widget.Button;   
       
    public class MainHandler extends Activity {   
       
            //聲明變量   
            private Button b1;   
            private ProgressDialog pd;   
       
            //定義Handler對象   
            private Handler handler =new Handler(){   
                    @Override   
                    //當(dāng)有消息發(fā)送出來的時(shí)候就執(zhí)行Handler的這個(gè)方法   
                    public void handleMessage(Message msg){   
                            super.handleMessage(msg);   
                            //只要執(zhí)行到這里就關(guān)閉對話框   
                            pd.dismiss();   
                    }   
            };   
       
            /** Called when the activity is first created. */   
        @Override   
        public void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
            setContentView(R.layout.main);   
       
            Resources res=  this.getResources();   
            //查看UI組件所在的線程名   
            Log.i("tag", "onCreate()-->"+Thread.currentThread().getName());   
       
            //定義UI組件   
            b1= (Button)findViewById(R.id.Button01);   
            //給按鈕綁定單擊事件監(jiān)聽器   
            b1.setOnClickListener(new View.OnClickListener() {   
       
                            @Override   
                            public void onClick(View v) {   
                                    //點(diǎn)擊按鈕后去處理長耗時(shí)操作   
                                    processThread();   
                            }   
                    });   
        }   
       
        private void processThread(){   
       
                //構(gòu)建一個(gè)下載進(jìn)度條   
                pd= ProgressDialog.show(MainHandler.this, "下載文件", "正在下載……");   
                Log.i("tag", "processThread()-->"+Thread.currentThread().getName());   
       
                new Thread(){   
       
                        @Override   
                        public void run(){   
                                Log.i("tag", "run()-->"+Thread.currentThread().getName());   
                                //在新線程里執(zhí)行長耗時(shí)方法   
                                longTimeMethod();   
                                //執(zhí)行完畢后給handler發(fā)送一個(gè)空消息   
                                handler.sendEmptyMessage(0);   
                        }   
       
                }.start();   
        }   
       
        //模擬下載文件的長耗時(shí)方法   
        private void longTimeMethod(){   
                try {   
                        Log.i("tag", "longTimeMethod-->"+Thread.currentThread().getName());   
                            Thread.sleep(10000);   
                    } catch (InterruptedException e) {   
                            e.printStackTrace();   
                    }   
        }   
    }
復(fù)制代碼
  
3、res/layout/main.xml的內(nèi)容就省略了,你們可以根據(jù)程序運(yùn)行截圖和程序代碼反推出來布局組件。
4、運(yùn)行程序查看結(jié)果:
  
這個(gè)例子里,在輔助線程的run方法中執(zhí)行長耗時(shí)操作,操作完畢后調(diào)用handler.sendEmptyMessage()方法,主線程中的Handler的 handleMessage()方法接受到這一消息,并做了就是關(guān)閉對話框的處理。
在接下來的例子里,讓我們處理一些更復(fù)雜的操作來理解和練習(xí)Handler的使用方法。
(待續(xù))

上一篇:第二十八講:Android多媒體(Media)入門
下一篇:Android軟件開發(fā)之盤點(diǎn)所有Dialog對話框大合集(一)
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2024-10-21 05:45 , Processed in 0.054184 second(s), 14 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表