handler與異步任務

不知道爲什麼,剛纔寫的安卓下的事件監聽會待審覈,好吧,只是爲了記錄下我的學習狀態而已
接下來說說安卓下的線程安全的問題
安卓的主線程是不允許用戶將耗時的事情放在主線程中進行處理的,因爲這樣容易造成線程的不安全
線程安全:在java中,線程的安全就是指,例如有兩個線程同時在操作同一個ArrayList的時候,我們都
知道,在add方法的時候,分兩步,第一步是增加數據,第二步是增加元素的個數,那麼問題就來了,
如果現在是兩個線程,第一個線程實現了第一步,然後線程暫時停止,而第二個線程獲得CPU的執行權,
那麼添加數據,然後兩個線程同時復活,然後元素只是增加了一個,這樣就會造成數據的丟失的問題。
那麼在安卓中,爲了避免主線程被阻塞,其實在主線程如果出現阻塞的話,會有ANR錯誤,ANR
如果主線程收到阻塞,那麼程序會蹦出一個窗口,通知用戶,是否將程序關閉這樣的問題。
首先利用handler這一個對象,可以在新開啓的子線程中發送數據給主線程,然後通過handler指揮主線程做
什麼事情,這樣就不會造成線程不安全,比如我們可以傳what,然後再handler.hanldeMessage(Message msg)的方法中
判斷what值,然後執行相應的操作。
異步任務有兩個需要注意,第一個是實現doInBackground方法,第二是onPostExecute,前面的是任務的執行,第二是任務
的返回值的處理。

 class MyTask extends AsyncTask<String,Void,String>
     {
         //異步任務進行
        protected String doInBackground(String... args) {
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            String line=null;
            StringBuilder sb=new StringBuilder();
            try {
                while((line=br.readLine())!=null){
                    sb.append(line);
                }
                return sb.toString();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
        //獲取返回值進行的操作
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            editText_1.setText(result);
        }
    }
private  class MyClickListener implements OnClickListener
        {
            public void onClick(View v)
            {
                new MyTask().execute();
                Toast.makeText(MainActivity.this,"按鈕被點擊",Toast.LENGTH_SHORT).show();
            }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章