最近在研究android的handler和AsyncTask的使用方法,經過幾天的學習和在網上查閱資料後總算做出了一個完整的程式,大家可以參考參考。
程式源碼如下:
private Handler handler = new Handler() {</p><p>@Override<br />public void handleMessage(Message msg) {<br />switch (msg.what) {<br />case 1:<br />adapter.notifyDataSetChanged();<br />break;<br />}<br />}<br />};<br />public void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />showContent();<br />}<br />private void showContent() {<br />listView = (ListView) findViewById(R.id.journals_list_one);<br />// MyTask myTask = new MyTask();<br />// myTask.execute(null);<br /> new Thread() {</p><p> @Override<br /> public void run() {<br /> try {<br /> Thread.sleep(5000);<br /> loadData();<br /> } catch (InterruptedException e) {<br /> e.printStackTrace();<br /> }<br /> }</p><p> }.start();<br />adapter = new JournalListAdapter(this, data);</p><p>listView.setAdapter(adapter);<br /> }</p><p>/**<br /> * 構造List列表資料<br /> */<br />private void loadData() {<br />if (data.size() <= 40) {<br />for (int i = 0; i < 10; i++) {<br />Map<String, String> map = new HashMap<String, String>();<br />map.put("title", getString(R.string.title));<br />map.put("desc", getString(R.string.content));<br />data.add(map);<br />Message message = handler.obtainMessage();<br />message.what = 1;<br />message.sendToTarget();<br />}<br />}<br />}</p><p>class MyTask extends AsyncTask<String, String, String> {</p><p>private ProgressDialog progressBar;</p><p>@Override<br />protected void onPreExecute() {<br />progressBar = new ProgressDialog(MainPageActivity.this);<br />progressBar.setMessage("正在載入資料請稍後...");<br />progressBar.setIndeterminate(true);<br />progressBar.show();<br />super.onPreExecute();<br />}</p><p>@Override<br />protected String doInBackground(String... params) {<br />try {<br />Thread.sleep(5000);<br />loadData();<br />} catch (InterruptedException e) {<br />e.printStackTrace();<br />}<br />return null;<br />}</p><p>@Override<br />protected void onProgressUpdate(String... values) {<br />super.onProgressUpdate(values);<br />adapter.notifyDataSetChanged();<br />}</p><p>@Override<br />protected void onPostExecute(String result) {<br />super.onPostExecute(result);<br />progressBar.dismiss();<br />}</p><p>}
上面我把2中方式都寫了,其中AsyncTask這個類感覺使用比較簡單,就是實現其中幾個方法,onPreExecute()方法是在任務剛開始運行時執行的一些初始化操作,比如初始化一個進度條等等,然後就執行doInBackground()方法這裡面主要放業務操作,比如查詢資料庫等,在這個方法執行的時候會調用onProgressUpdate(),可以在這個方法中更新UI介面,最後是調用onPostExecute()方法,當得到業務結果後就可以在這個方法中返回給UI線程,也可以關閉一些執行這個業務時開的一些資源。大家可以看得出AsyncTask這個類是一個泛型類,這個類的三個參數以此對應doInBackground(String... params),onProgressUpdate(String... values),onPostExecute(String result)的參數,很形象的···如果不需要傳參和傳回值,可以用Void代替。而doInBackground(String... params)方法的傳回值也就是onPostExecute(String result)方法的參數值,因為doInBackground方法執行後返回的值是在onPostExecute(String result)中處理的。
用handler方式處理需要知道與handler相關的幾個組件,Looper和Queue,其實Looper的作用就是把handler發送的訊息放到Queue中,並把訊息廣播給所有與這個Queue相關的handler,而Queue一般是主線程開啟的時候就給這個線程分配了一個,所以你要與UI主線程通訊必須用於這個Queue相關聯的handler對象才行,一般handler對象在那個線程中建立的就與那個線程的queue關聯,所以在UI線程中建立的handler對象就與UI線程通訊,這樣我們就可以在子線程中發送訊息給主線程,實現更新UI的功能。那主線程又是怎麼處理子線程發送的訊息的呢?其實在產生handler對象的時候我們就要實現handler對象的handleMessage()方法這個方法就是主線程接受並處理子線程發送過來的訊息的方法,從而實現 更新UI線程的功能。