android handler和AsyncTask用法
最近在研究android的handler和AsyncTask的使用方法,經過幾天的學習和在網上查閱資料后總算做出了一個完整的程序,大家可以參考參考。
程序源碼如下:
private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: adapter.notifyDataSetChanged(); break; } } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); showContent(); } private void showContent() { listView = (ListView) findViewById(R.id.journals_list_one); // MyTask myTask = new MyTask(); // myTask.execute(null); new Thread() { @Override public void run() { try { Thread.sleep(5000); loadData(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); adapter = new JournalListAdapter(this, data); listView.setAdapter(adapter); } /** * 構造List列表數據 */ private void loadData() { if (data.size() <= 40) { for (int i = 0; i < 10; i++) { Map<String, String> map = new HashMap<String, String>(); map.put("title", getString(R.string.title)); map.put("desc", getString(R.string.content)); data.add(map); Message message = handler.obtainMessage(); message.what = 1; message.sendToTarget(); } } } class MyTask extends AsyncTask<String, String, String> { private ProgressDialog progressBar; @Override protected void onPreExecute() { progressBar = new ProgressDialog(MainPageActivity.this); progressBar.setMessage("正在加載數據請稍后..."); progressBar.setIndeterminate(true); progressBar.show(); super.onPreExecute(); } @Override protected String doInBackground(String... params) { try { Thread.sleep(5000); loadData(); } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); adapter.notifyDataSetChanged(); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); progressBar.dismiss(); } }
上面我把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線程的功能。