android handler和AsyncTask用法

openkk 12年前發布 | 39K 次閱讀 Android開發 移動開發 Android

最近在研究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線程的功能。

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!