30/09/2018, 17:57
Hỏi về AsyncTask trong Android
Mấy hôm nay em đọc về AsyncTask mà đầu cứ u mê.
Async Task chủ yếu dùng để làm gì ?
Sao các tuts về AsynCTask lại thường tạo 1 class extends AsyncTask ngay trong main class ?
Và String…params ? How to truyền dữ liệu vào đó ? Và 3 cái Parameters trong <> khi extends.
mong mọi người giúp :((
Bài liên quan
http://developer.android.com/reference/android/os/AsyncTask.html
Em vào đây đọc thử đi, anh thấy nó nói rất rõ ràng rồi mà.
em đọc tiếng anh rồi. nhưng đầu e dịch ra lủng củng. hiểu không rõ ràng.
nhất là về 3 cái parameters và String…params
Anh giải thích sơ quá một chút:
Vậy nên Google làm ra AsyncTask để thực hiên background operation. Không dùng Main Thread nữa.
Tại sao lại extends AsyncTask:
-AsyncTask là abstract class, nó chưa implement cho em cái gì cả. Nên nếu em muốn thực hiện một công việc nào đó bằng AsyncTask em phải extends nó và tạo một class cụ thể. Còn viết ở đâu thì tùy vào mục đích sử dụng. Em tách ra class riêng cũng được mà để nó làm inner class cũng được.
String… params:
-Cái này trong java gọi là vargars. Tức là em có thể truyền vào nhiều tham số có kiểu dữ liệu là String (thay String bằng Integer, hoặc Long… cũng được). Thường dùng trong trường hợp em chưa biết được số lượng tham số cụ thể cần truyền vào là bao nhiêu.
Ba cái parametres trong <> là gì?
-Trong ví dụ có đoạn khai báo
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>
Truyền vào thì ta làm như sau:
new DownloadFilesTask().execute(url1, url2, url3);
url1, url2, url3 có kiểu dữ liệu là URL. Chính là vargars anh nói ở trên.
Em muốn làm Android thì phải vững Java core, đó là điều bắt buộc. Không vững Java thì không vững Android. Không vững Android chưa chắc đã không vững Java
Cho nên quay về làm sub nốt Java core mau @Sky
Khi muốn cập nhật UI nhưng tác vụ ngắn thì bạn sử dụng Handler, còn những công việc đòi hỏi thời gian lâu hơn thì nên dùng AsyncTask.
Bạn nhìn hình dưới đây để hiểu cách truyền vào các tham số và ý nghĩa của nó nhé.
tuân chỉ
Khắc cốt ghi tâm lời anh dạy
Bổ sung xíu cho bạn @Hnib
Bây giờ ví dụ như ta muốn thực hiện việc download một tấm ảnh từ internet bằng URL thông thường.
Trong main ta có thể dùng new MyTask().execute(“URL ảnh”);
Khi khởi động async này thì URL ảnh sẽ truyền vào <String, Integer, JsonObject>
String này dùng trong doInBackGround và thực hiện download trong hàm này, việc update giao diện ta thực hiện trong onPostExecute
Trong Android tồn tại một thread chính được gọi là
MainUIThread
. Trong Android sử dụng cơ chế Looper/Message để thực thi và quản lí luồng xử lí dẫn đến Thread này không được phép có những tác dụng phụ kiểu làm đơ màn hình.Lúc này nền tảng Android yêu cầu người dùng (người dùng nền tảng hiểu là dev và những người như dev) implement code ở các thread khác để tránh ảnh hưởng đến MainUIThread. Nếu em để ý thì để giao tiếp giữa hai thread rất khó khăn, chưa kể các effect như bất đồng bộ, blad blad…
Android sử dụng một cơ chế để các thread khác giao tiếp với
MainUIThread
là Handle. Cách làm này giúp hạn chế vấn đề bất đồng bộ tuy nhiên lại gặp phải vấn đề lớn.Thread khác muốn làm việc với view nhưng view lại chết theo Activity quản lí nó rồi thì phải làm sao?
Lúc này Android sinh ra một cơ chế gọi là AsyncTassk để giải quyết vấn đề này.
Cái ảnh này cực hay luôn, nhìn cái là bao nhiêu thứ nó tuôn ra
cho em hỏi java core có phải mấy cái thư viện như .lang, .io… ko ạ ?
The issue deleted…
Thật sự đây là hệ quả của việc học theo kiểu ăn xổi/đi tắt nên xuất hiện nhiều lỗ hổng kiến thức, lỗ hổng tư duy, không vận dụng được cái mình đã học để giải quyết các bài toán phức tạp hơn.
Muốn lấy/xử lí giá trị result ở ngoài method onPostExecute thì chỉ việc truyền object này cho 1 method của 1 object khác trong method onPostExecute thôi
Bạn cho mình hỏi. Khi activity khởi chạy asyntask. nhưng trong khi asyntask đang chạy mà activity bị chết hoặc chuyển về background. thì asyntask lúc này có còn chạy hay không. và sau khi user quay lại activity thì asyntask lúc nào sẽ ntn.
Mình cảm ơn
asyntask vẫn chạy nhé. Khi User quay lại activity thì 1 asyntask mới được execute.