Android cung cấp cho chúng ta 1 asyntask -> rất tiện lợi.
LTV sẽ ko cần phải động đến các thread hay những handler rối rắm
package com.example.asy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv;
int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
AsyncTask<Void, Integer, String> as = new AsyncTask<Void, Integer, String>() {
//Tham số đầu tiên là các tham số truyền vào
//Tham số thứ 2 là các chỉ số sẽ update trong quá trình chạy
//Tham số thứ 3 là giá trị trả về
@Override
protected void onPostExecute(String result) {//kết thúc -> nhận tham số html , kết thúc tiến trình
tv.setText(result);
}
@Override
protected void onProgressUpdate(Integer... values) { B2. nhận values từ B1 chuyển lên , gán vào textview
tv.setText(values[0].toString());
}
@Override
protected String doInBackground(Void... params) {//B1. làm việc ngầm
String html = "aaaaaaaaaaa";
int i = 0;
while (i < 100000000000000000000000000000000000000000000) {
publishProgress(i++);//Gọi đến onProgressUpdate và truyền i vào values "cứ lặp 1 cái là gọi đến onProgressUpdate 1 cái"
}
return html;//làm xong thì gọi onPostExecute với tham số là HTML
}
};
as.execute();
}
}
đoạn mã trên mình đã comment khá dễ hiểu , chắc sẽ ko cần giải thích gì thêm
Tóm lại chúng ta sẽ
- dùng Handler + runnable khi muốn cứ sau 1 khoảng thời gian lại làm 1 việc gì đó ko liên quan đến độ trễ( VD lấy dữ liệu từ trên mạng về máy sẽ mất 1 khoảng thời gian chúng ta sẽ gọi là trễ)
+ VD : Ăn cơm -> sau 20s -> rửa bát -> ăn cơm -> sau 20s ->rửa bát ->...
+ hoặc : sau 20s nữa thì ăn cơm || ăn cơm -> sau 20s -> rửa bát -> kết thúc
- dùng thread + runnable khi muốn thực hiện 1 công việc liên tục mà liên quan đến độ trễ
+ VD : while(true){ //lấy mã html từ 1 trang web liên tục để kiểm tra xem bao giờ mã này thay đổi ( ^_^) giả dụ thế }
- dùng AsynsTask khi muốn thực hiện 1 lần công việc
+ VD : Update dữ liệu lên webservice , download 1 image .. blah blah