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