相信不少攻城獅覺得另開一個類寫線程肯定覺得特別麻煩 代碼也繁瑣 畢竟不能寫在主線程中 主線程只用來刷新一些ui頁面 但AsyncTask就不同了 可以寫在主線程中 不會造成程序崩潰 是谷歌為了解決Thread復(fù)雜麻煩出了一個解決方案? 這里我就簡單講兩個例子
主要是理解才可以靈活應(yīng)用 我這里先講一個數(shù)字增長從0到100使用到AsyncTask線程后臺運行 為了顯示出效果使用到線程休眠 這里先部署一下包的布局和xml 文件
第一個為功能清單 一些權(quán)限sdk等在這里設(shè)置
MainActivity是我第一個講的內(nèi)容ReadText 讀取設(shè)備存儲的一個txt文件 ReadInt 是讀取網(wǎng)路數(shù)據(jù)的一個java
然后看一下我的xml 代碼 我這里選的線性布局 你可以根據(jù)愛好和每個布局的特色來設(shè)計布局 這里我就寫了兩個控件 TextView和Button 我為了方便沒把文字寫到數(shù)組中 根據(jù)需要自己去添加
然后來看我的java文件 先照顧一下一些小白吧 第一行為你的包名
import 是調(diào)用api文件 以第一個為例 調(diào)用 安卓包下的APP的activity
然后公開的class 繼承于Activity
簡單的聲明控件 格式為private 控件總稱 你想定義的名字
這里是activity的生命周期onCreate返回一個保存過的緩存數(shù)據(jù) 具體生命周期建議去谷歌官網(wǎng)查看
設(shè)置上下文示圖 res下的布局的布局id
綁定控件id 和按鈕設(shè)置監(jiān)聽 按鈕設(shè)置點擊監(jiān)聽建議使用這個 不建議使用xml中指明點擊監(jiān)聽 在一些手機可能會出問題
在這里我設(shè)置了按鈕點擊后就不可以再點擊了 設(shè)置Enabled 為假
調(diào)用我的MyTask方法 下面會寫出來具體的實現(xiàn)
這里具體寫了一個MyTask 繼承于AsyncTask 如果你要設(shè)置其他的類可以訪問可以添加public公開private自身包訪問 protected只有這個方法才可以訪問
首先寫出來這個方法 必須生成一個方法 叫doInBackground后臺運行的方法 你可以右擊生成方法 或者點紅色感嘆號自動補全代碼實現(xiàn)方法
onPreExecute準備工作做的事情 我加了一個設(shè)置文本用來提示用戶正在加載
然后后臺運行的工作是數(shù)字自增加 注意 一定不要把ui刷新寫在這里 否則會崩潰
加入一個線程 防止自增長過快 看不出來效果
用try 方法包圍
最后無法實行的結(jié)果 返回一個空值
進展更新調(diào)用的方法 定義int類型的值 文本設(shè)置得到的數(shù)字
最后進程結(jié)束的工作 進程完成自動調(diào)用這個方法 我寫了兩個提示 一個Toast一個文本改成執(zhí)行完畢
效果圖就不示范了 本人確保代碼可以正確運行 有不懂的可以來問我
下面開始講第二個示例 來獲取手機存儲設(shè)備的一個txt文件 建議自己寫一個文件來實踐 直接放到手機存儲中即可 你也可以使用完畢刪除他 我的文件名叫做testText.txt
1同樣先來示例我的布局截圖自己xml代碼
這里加了一個按鈕用來讀取文件 然后還有一個ProgressBar用來顯示進度 EditText用來顯示獲取的文件
前面已經(jīng)講過這個了 這里就不多講了
按鈕點擊監(jiān)聽實現(xiàn)指明路徑 開啟一個新的AsyncTask 注意括號里的代碼 路徑 整數(shù) string數(shù)組
注意需要指明路徑的正確位置 環(huán)境 得到存儲設(shè)備 文件名
下面調(diào)用的方法也已經(jīng)講過 有不明白的去上面看一下
主要是在自己寫這個讀的方法 得到數(shù)組 初始化 為了提示用戶得到數(shù)據(jù)寫了兩個長度來給進度條顯示進程
緩沖讀取器的初始化
下面嘗試讀取文件 初始化緩沖讀取器 輸出流讀取 路徑輸出讀取 路徑名字file 前面已經(jīng)定義過路徑的地址 編碼格式為GBK 可以根據(jù)自己情況而定 得到緩沖讀取器中的讀取行
需要判斷文件中是否有行內(nèi)容 當(dāng)不為空執(zhí)行查詢 stringBuilder動態(tài)數(shù)組添加獲取到的內(nèi)容加換行符號 讀取長度疊加等于文件得到字節(jié)的長度 定義一個int值用來公布匯報進程 同樣休眠0.1秒 行等于緩沖讀取器的讀取行 返回數(shù)組 下面是防止找不到文件 或已經(jīng)讀取完畢等意外情況的優(yōu)化 自動生成代碼
最后 嘗試如果緩沖讀取器不為空值 需要關(guān)閉緩沖讀取器 否則內(nèi)存泄露 會影響用戶體驗的性能 否則出問題返回空值 思路要嚴謹
線程更新的時候?qū)⒌玫降拈L度解析設(shè)置到進度條上顯示
最容易忽略的一步 在功能清單上注冊讀取內(nèi)存卡的權(quán)限
到這里我們的優(yōu)化講解就已經(jīng)講完了 我把所有用到的數(shù)據(jù)都公布在這里了 如果還有不懂的 點個小心心送給小編 不給我也可以講述 不給就是小編講的不夠完美嘛
這么晚了 我也要洗洗睡了