Android 線程處理
1.多線程的兩種實現方式:
- Thread.
- join().等待當前線程執行完畢后,才允許為其他線程的執行,如果此線程中斷產生InterruptedException異常。
- yield().讓此線程暫停執行,先讓其他線程執行
- start(),run(),setPriority()...
- Runnable.
- 只需實現run(),但沒有啟動線程的start()方法,因此需要使用Thread類
2.線程安全:線程同步synchronized。可以用作線程方法和線程塊。
//synchronized自成一個區塊,可以靈活的指定對象與程序區塊 synchronized(this){ code... }
3.多線程的互動處理wait()和notify()
- notify()只會喚醒同一個對象但處于wait()狀態的線程。
- 這兩個方法定義在Object類中,任何對象都可以使用,但必須在synchronized域中才可以調用,否則illegalMonitorStateException異常。
- 避免相互等待-死鎖
UI線程(管理用戶界面的線程)是不安全的,不要阻塞ui線程、確保只在ui線程中訪問ui組件也就是說只能在UI線程中修改UI組件,不應出現在后臺線程中修改的UI組件的情況。比較耗時的工作最好在后臺進行,否則可能阻塞UI界面
主要有兩種方式:
- handler.通過顯式的拋出和捕獲消息,與UI進行交互。
- Message. Message保存了后臺返回的數據,可以存儲bundle等數據形式。 messageQueue是線程對應looper的一部分,負責存儲從后臺進程中拋回的和當前handler綁定的message,是一個隊列。
- 實現handleMessage()
- obtainMessage()獲取Message對象
- sendMessage()
- Runnable.
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable, long)
- AsyncTask - AsyncTask<Params, Progress, Result>
- Params 啟動任務執行的輸入參數,比如HTTP請求的URL,Progress 后臺任務執行的百分比。Result 后臺執行任務最終返回的結果,比如String
- doInbackground().在后臺線程中運行。
- onPostExcute(void result).UI線程中運行
- 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!