標籤:
1. 線程Thread
2. 非同步任務AsyncTask
-------------------------------------------------
-------------------------------------------------
1. 線程Thread
在APK開啟後,就會有一個主線程,負責與使用者互動。如果在主線程中執行了耗時操作,那麼介面就會停止回應,所以要將耗時操作轉移到別的線程中
2. 非同步任務AsyncTask
耗時任務不能再UI主線程中執行,非同步任務使用AsyncTask
AsyncTask<String, Float, String>
//第一個參數String代表傳入參數
//第二個參數Float代表 執行過程中的數值
//第三個參數String 代表傳回值
下面是一個讀取網頁操作的demo
① 布局檔案: 點擊button,將擷取到的內容放在TextView中顯示
<Button android:id="@+id/btnRead" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/read_website" /><ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /></ScrollView>
② 定義AsyncTask
在 doInBackground 中不能調用UI控制項進行操作
對UI控制項的操作必須在其他幾個回呼函數中執行:onCancelled,onCancelled(),onPostExecute, onPreExecute, onProgressUpdate
public void readUrl(String url) { new AsyncTask<String, Float, String>() { //第一個參數String代表傳入參數 //第二個參數Float代表 執行過程中的數值 //第三個參數String 代表傳回值 @Override protected String doInBackground(String... params) { // 在後台運行 try { URL url = new URL(params[0]); URLConnection conn = url.openConnection(); long total = conn.getContentLength(); // 要讀取的內容總長度 InputStream is = conn.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; StringBuilder builder = new StringBuilder(); while ((line = br.readLine()) != null) { builder.append(line); float values = builder.toString().length() / total; publishProgress(values); // 對應onProgressUpdate, 對外發布進度 } br.close(); isr.close(); is.close(); return builder.toString(); //對應onPostExecute } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); } @Override protected void onCancelled(String result) { // TODO Auto-generated method stub super.onCancelled(result); } @Override protected void onPostExecute(String result) { // 當前的Async執行完畢後會回調它 tv1.setText(result); super.onPostExecute(result); } @Override protected void onPreExecute() { // 當前的Async執行完畢前會回調它 Toast.makeText(getApplicationContext(), "start Read", Toast.LENGTH_SHORT).show(); super.onPreExecute(); } @Override protected void onProgressUpdate(Float... values) { // 在執行任務的過程中對外發布執行的進度 Log.d("CARLOZ", "values = " + values[0]); super.onProgressUpdate(values); } }.execute(url);}
③ 調用AsyncTask
TextView tv1;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv1 = (TextView) findViewById(R.id.textView1); findViewById(R.id.btnRead).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { readUrl("http://carloz.duapp.com"); } });}
結果如下:
Android Thread和AsyncTask