Android 線程處理

openkk 12年前發布 | 5K 次閱讀 網絡開發

1.多線程的兩種實現方式:

  1. Thread.
    1. join().等待當前線程執行完畢后,才允許為其他線程的執行,如果此線程中斷產生InterruptedException異常。
    2. yield().讓此線程暫停執行,先讓其他線程執行
    3. start(),run(),setPriority()...
  2. Runnable.
    1. 只需實現run(),但沒有啟動線程的start()方法,因此需要使用Thread類

2.線程安全:線程同步synchronized。可以用作線程方法和線程塊。

//synchronized自成一個區塊,可以靈活的指定對象與程序區塊
synchronized(this){
   code...
}

3.多線程的互動處理wait()和notify()

  1. notify()只會喚醒同一個對象但處于wait()狀態的線程。
  2. 這兩個方法定義在Object類中,任何對象都可以使用,但必須在synchronized域中才可以調用,否則illegalMonitorStateException異常。
  3. 避免相互等待-死鎖
4.線程通信。

UI線程(管理用戶界面的線程)是不安全的,不要阻塞ui線程、確保只在ui線程中訪問ui組件也就是說只能在UI線程中修改UI組件,不應出現在后臺線程中修改的UI組件的情況。比較耗時的工作最好在后臺進行,否則可能阻塞UI界面

主要有兩種方式:

  1. handler.通過顯式的拋出和捕獲消息,與UI進行交互。
    1. Message. Message保存了后臺返回的數據,可以存儲bundle等數據形式。 messageQueue是線程對應looper的一部分,負責存儲從后臺進程中拋回的和當前handler綁定的message,是一個隊列。
      1. 實現handleMessage()
      2. obtainMessage()獲取Message對象
      3. sendMessage()
    2. Runnable.
      1. Activity.runOnUiThread(Runnable)
      2. View.post(Runnable)
      3. View.postDelayed(Runnable, long)
  2. AsyncTask - AsyncTask<Params, Progress, Result>
    1. Params 啟動任務執行的輸入參數,比如HTTP請求的URL,Progress 后臺任務執行的百分比。Result 后臺執行任務最終返回的結果,比如String
    2. doInbackground().在后臺線程中運行。
    3. onPostExcute(void result).UI線程中運行
    4. onProgressUpdate().doInBackground中調用了publishProgress之后,ui線程調用該方法,動態的改變進度條。

 

//下面提供一個簡單的Asynctask的實例
class GetCSDNLogoTask extends AsyncTask<String, Integer, Bitmap>{
//String 傳入參數類型,Integer 進度顯示,Bitmap 返回值類型,這個類用于異步獲取圖片內容
        @Override
        protected Bitmap doInBackground(String... url) {
            // TODO Auto-generated method stub
            publishProgress(0); //?°????è°??”¨onProgressUpdate(Integer... progress)
            HttpClient client =new DefaultHttpClient();
            publishProgress(30);
            Log.i("log_out", url[0]);
            HttpGet get=new HttpGet(url[0]);
            final Bitmap bt;
            try {
                HttpResponse response =client.execute(get);
                bt=BitmapFactory.decodeStream(response.getEntity().getContent());
            } catch (ClientProtocolException e) {
                return null;
            } catch (IOException e) {
                return null;
            }
            publishProgress(100);
            return bt;
        }
        @Override
        protected void onCancelled() {
            progressBar.setProgress(0);
        }
        @Override
        protected void onCancelled(Bitmap result) {
            progressBar.setProgress(0);
        }
        @Override
        protected void onPostExecute(Bitmap result) {
            if(result != null){
                Toast.makeText(AsyncTaskActivity.this, "success to get the logo...", Toast.LENGTH_LONG).show();
                imgView.setImageBitmap(result);
                Log.i("Log_out","img setting...");
            }else {
                Toast.makeText(AsyncTaskActivity.this, "failed...", Toast.LENGTH_LONG).show();
            }
        }
        @Override
        protected void onPreExecute() { //??¨doInBackground()?1??‰????è¢?è°??”¨?????¨ui?o??¨??‰§è??
            imgView.setImageBitmap(null);
            progressBar.setProgress(0);     
        }
        @Override
        protected void onProgressUpdate(Integer... progress) {//??′?–°è???o|???è???o|
            progressBar.setProgress(progress[0]);
        }   
    }

 

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