您好,登錄后才能下訂單哦!
上幾篇博文給大家介紹有關listView使用方法( GridView和Gallery和listView類似,我也寫2個有關的例子等會上傳到我的上傳,大家有需要的可以去下載。),接下來我開始為大家介紹安卓里面又一項很重要的技術--多線程的使用。(本來想先介紹四大組件的,但是后來想想介紹完線程就可以用listView結合線程做個下載項目,所以先介紹線程)
1:ANR的介紹
(1):ANR異常指的是當我們執行的一部分代碼需要耗時操作(例如從網絡下載數據,查找數據庫等)的時候,由于都是在主線程操作,這時候我們就需要等待耗時操作結束才能執行其他主線程命令,這樣就會出現界面無響應的情況。安卓系統規定如果耗時操作超過10秒的話就會報ANR異常。如下圖
2:解決ANR異常
(1):由于都是在主線程進行,學過java的都知道這時候我們就剛使用線程來將耗時操作放在子線程,這樣就不會影響用戶主線程操作別的功能。現在我給大家做個小例子。設置一個按鈕和文本框,當點擊按鈕時候開始下載,等下載結束時候文本內容變為“下載完成”。耗時操作代碼如下(那些找到控件對象的代碼我就不寫了大家可以到我的下載下載完整代碼看)
//開始下載后設置文本為"下載中" mTextView.setText("下載中"); //寫個線程的匿名類執行耗時操作 new Thread(){ public void run() { try { sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } //下載完成后改變文本內容 mTextView.setText("下載完成"); }; }.start();
(2):Handler類的使用
當我們執行代碼后發生的異常,如下圖
異常提示說我們只能在main線程操作UI,這時候怎么通知主線程我們已經下載可以進行繼續下一步操作?其實很簡單,那就是使用Hander類使用。首先我們寫個類(MyHander)繼承handler然后重寫handleMessage()方法,然后定義一個MyHander類的成員變量。具體代碼如下
private MyHandler handler = new MyHandler(); class MyHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }
當我們執行完耗時操作的時候調用handler類的sendMessage()方法將我們所需要的信息傳遞出去,具體代碼如下(這里注意了msg對象不能設置成成員變量,每次傳遞消息都要new一個msg對象,否則會出問題)
Message msg = new Message(); msg.obj = "下載完成"; handler.sendMessage(msg );
剛才我們不是寫了個Myhander類,在handleMessage方法就將我們所傳的信息對象返回,于是我們取出信息對象的內容并把文本內容改變(),這樣就大功告成(HanderMessage是在main線程里處理UI控件所以不會報異常大家可以在方法里面打個日志)
class MyHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); String result = (String) msg.obj; mTextView.setText(result); } }
以上就是今天我為大家介紹的內容,稍后我會吧完整的代碼上傳到我的下載,需要的可以去下載。名字為“安卓多線程#1”
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。