編輯:關於Android編程
1). 不要阻塞UI線程 ;當一個程序第一次啟動時,Android會同時啟動一個對應的主線程(Main Thread),主線程主要負責處理與UI相關的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,並把相關的事件分發到對應的組件進行處理。所以主線程通常又被叫做UI線程。
2). 確保只在UI線程中訪問Android UI控件。
1) 定義AsyncTask的子類; 2) 實現AsyncTask中定義的方法:(可以全部實現,也可以只實現其中一部分)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text_main_info = (TextView) findViewById(R.id.text_main_info); new MyAsyncTask(MainActivity.this).execute(urlString); }
class MyAsyncTask extends AsyncTask{ private Context context; private ProgressDialog pDialog = null; public MyAsyncTask(Context context) { this.context = context; // 實例化一個ProgressDialog進度對話框 pDialog = new ProgressDialog(context); pDialog.setIcon(R.drawable.ic_launcher); pDialog.setTitle("進度提示:"); pDialog.setMessage("數據加載中......"); // 以下這個方法是給進度框設置樣式,如果參數是1或者ProgressDialog.STYLE_HORIZONTAL表示精確進度條 pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 備注:當new ProgressDialog()時,設置第二個參數,則無需上面的語句。 // 如果第二個參數是0,表示模糊進度條,如果是1則是精確進度條,必要的時候需要計算進度數值。 } @Override protected void onPreExecute() { super.onPreExecute(); pDialog.show();// 讓進度對話框顯示 } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); // 讓進度對話框上的數值不斷發生變化。其中的參數values就是不斷從doInBackground()方法中返回的數據。 pDialog.setProgress(values[0]); } @Override protected byte[] doInBackground(String... params) { BufferedInputStream bis = null; ByteArrayOutputStream baos = null; HttpURLConnection httpConn = null; // 訪問網絡,並下載數據開始 try { URL url = new URL(params[0]); httpConn = (HttpURLConnection) url.openConnection(); httpConn.setRequestMethod("GET"); httpConn.setConnectTimeout(8000); httpConn.setDoInput(true); httpConn.connect(); if (httpConn.getResponseCode() == 200) { bis = new BufferedInputStream(httpConn.getInputStream()); baos = new ByteArrayOutputStream(); // 這個length在這裡代表整個文件的長度 int length = httpConn.getContentLength(); // 這個變量表示已經讀取的數據長度 int readLength = 0; byte[] buffer = new byte[256]; int c = 0; while ((c = bis.read(buffer)) != -1) { // readLength += c,是為了計算出截止到當前已經讀取的總長度 readLength += c; // 將字節寫進內存流,將來方便裝成字節數組 baos.write(buffer, 0, c); baos.flush(); // 此處是計算下載進度。利用已經讀取的長度除以文件總長度。 int progress = (int) (readLength / (float) length * 100); // 將進度不斷發布出去,便於onProgressUpdate()方法接收後不斷修正進度對話框中的數據 publishProgress(progress); } return baos.toByteArray();// 將內存流中的內容轉成字節數組後返回。 } } catch (Exception e) { e.printStackTrace(); } finally { // 將必要的流和連接關閉,以釋放資源 try { bis.close(); baos.close(); httpConn.disconnect(); } catch (Exception e) { e.printStackTrace(); } } return null; } @Override protected void onPostExecute(byte[] result) { super.onPostExecute(result); if (result != null) { // 將下載下來的內容顯示在指定的文本框中 text_main_info.setText(new String(result)); } else { // 如果下載內容為空,則提示下載失敗。如果不做判斷,則容易發生空指針異常 text_main_info.setText("下載失敗!"); } // 讓進度對話框消失 pDialog.dismiss(); } }
Bluetooth Android平台包括藍牙網絡協議棧,它允許設備以無線方式與其他藍牙設備進行數據交換的支持。應用程序框架提供了訪問通過Android藍牙API的藍牙功
自微信出現以來取得了很好的成績,語音對講的實現更加方便了人與人之間的交流。今天來實踐一下微信的語音對講的錄音實現,這個也比較容易實現。在此,我將該按鈕封裝成為一個控件,並
這裡記錄一個比較方便的方式來解決Textview設置不同顏色的字體的方法。可能第一反應是布局的嵌套,這個方法肯定可以啊,但是肯定不推薦啊,布局要盡量減少布局的嵌套,其次,
前言與Linux相同,Android中的應用程序通過設備驅動訪問硬件設備。設備節點文件是設備驅動的邏輯文件,應用程序使用設備節點文件來訪問驅動程序。在Linux中,運行所