Android Thread和AsyncTask

來源:互聯網
上載者:User

標籤:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.