AsyncTaskLoader trong Android
Xử lý bất đồng bộ, hay còn gọi là xử lý đa tiến trình với AsyncTasklà phương tiệnđể xử lý công việc sử dụng background thread và giao tiếp với UI thread mà không dùng Thread hay Handler, có dữ liệu trả về. Vì được khuyến cáo là nên sử dụngAsyncTaskthay cho Handler nên mình sẽ bỏ qua không nói đến trong bài này. Đối với AsyncTask thì ta cần tạo một lớp kế thừa từAsyncTask, sau đó từ MainActivity ta gọi hàmexecute() của tiến trình này là OK.. VD: public class DoLogin extends AsyncTaskCác khái niệm về AsyncTaskAsyncTask<Params, Progress, Result>có 3 đối số là các Generic Type:
Những đối số nào không sử dụng trong quá trình thực thi tiến trình thì ta thay bằngVoid. Thông thường trong 1 AsyncTask sẽ chứa 4 hàm, đó là :
Trong 4 hàm trên thì hàmdoInBackground()bắt buộc phải tồn tại, trình biên dịch sẽ yêu cầu bạn add nó vào, còn các hàm khác có thể khuyết, nhưng theo khuyến cáocác bạn nên sử dụng đầy đủ 4 hàm đã nêu. DEMO ứng dụng của AsyncTaskBài ví dụđơn giản là cập nhật Progressbar (không quản lý kết quả trả về), nên đối số 1 và đối số 3 ta để Void, đối số 2 ta để Integer. tui sẽ sử dụng 2 kiểu progressBar cùng thể hiện xử lý. Đầu tiên tạo một ứng dụng như hình, và một class dùng để xử lýMyAsyncTaskkế thừaAsyncTask. Layout XML: Class MyAsynceTask.java: package com.example.erp_tuyen.asynctaskdemo; import android.app.Activity; import android.os.AsyncTask; import android.os.SystemClock; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; /** * Created by Erp-Tuyen on 04/01/2018. */ public class MyAsyncTask extends AsyncTask { //ProgressBar progressBar; TextView textView; Button button; //khai báo Activity để lưu trữ địa chỉ của MainActivity Activity contextCha; //constructor này được truyền vào là MainActivity public MyAsyncTask(Activity ctx) { contextCha=ctx; Log.i("TONAER","MyAsyncTask"); } //hàm này sẽ được thực hiện đầu tiên @Override protected void onPreExecute() { ProgressBar progressBar=(ProgressBar) contextCha.findViewById(R.id.progressBar); progressBar.setVisibility(View.VISIBLE); // TODO Auto-generated method stub super.onPreExecute(); Toast.makeText(contextCha, "onPreExecute!", Toast.LENGTH_LONG).show(); } //sau đó tới hàm doInBackground //tuyệt đối không được cập nhật giao diện trong hàm này @Override protected Void doInBackground(Void... arg0) { for(int i=0;i<=100;i++) { //nghỉ 100 milisecond thì tiến hành update UI SystemClock.sleep(100); //khi gọi hàm này thì onProgressUpdate sẽ thực thi publishProgress(i); } return null; } /** * ta cập nhập giao diện trong hàm này */ @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); //thông qua contextCha để lấy được control trong MainActivity //R.id.progressBar1: là pgbar kiểu ngang, nó sẽ chạy theo % của thanh ProgressBar progressBar2=(ProgressBar) contextCha .findViewById(R.id.progressBar1); //vì publishProgress chỉ truyền 1 đối số //nên mảng values chỉ có 1 phần tử int giatri=values[0]; //tăng giá trị của Progressbar lên progressBar2.setProgress(giatri); //đồng thời hiện thị giá trị là % lên TextView TextView textView=(TextView) contextCha.findViewById(R.id.textView); textView.setText(giatri+"%"); } /** * sau khi tiến trình thực hiện xong thì hàm này sảy ra */ @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); Toast.makeText(contextCha, " GG WP !", Toast.LENGTH_LONG).show(); ProgressBar progressBar=(ProgressBar) contextCha.findViewById(R.id.progressBar); progressBar.setVisibility(View.GONE);//dùng cái này để dừng cái pgbar hình tròn. } /** * tui làm 2 hàm ví dụ này về params trong Android, để chơi thôi không có tác dụng gì trong cái AsyncTask này */ public void goividu() { viduParamschoham(); viduParamschoham(5); viduParamschoham(5,6); viduParamschoham(5,6,5,6,7,8,9,0,0); } /** * dấu ... dùng khai báo param * tức là ta truyền bao nhiêu đối số cũng được * ds trở thành mảng 1 chiều * @param ds */ public void viduParamschoham(int ... ds) { //test chơi... int pt0=ds[0];//có lỗi nếu như không truyền đối số nào for(int n:ds) { System.out.println(n); } //hoặc for(int i=0;iVà MainAcivity.java.Tiến trình MyASyncTask sẽ được thực thi khi bên MainActivity ta gọi phương thức: .execute(): Như vậy là đã hoàn tất. Code đã được comment rất tỷ mỹ, hãy để lại comment để được giải đáp hoặc đặt câu hỏi lên fanpage của LaptrinhVB. Bạn có thể tham khảo source code tại đây Trong bài tiếp tui sẽ làm một demo về AsynceTaskcó dữ liệu trả về, đống thời có kết nối với SQL Server, các bạn chú ý theo dõi. Nguồn: Tổng hợp từ Internet. |