Android AsyncTask sẽ thực hiện hoạt động nền trên chuỗi nền và cập nhật trên chuỗi chính. Trong android, chúng ta không thể chạm trực tiếp luồng nền vào luồng chính trong quá trình phát triển android. asynctask giúp chúng tôi thực hiện giao tiếp giữa chuỗi nền với chuỗi chính.
Phương thức AsyncTask
-
onPreExecute () - Trước khi thực hiện thao tác nền, chúng ta nên hiển thị thứ gì đó trên màn hình như thanh tiến trình hoặc bất kỳ hoạt ảnh nào cho người dùng. chúng ta có thể kết hợp trực tiếp hoạt động nền bằng cách sử dụng doInBackground () nhưng để thực hành tốt nhất, chúng ta nên gọi tất cả các phương thức asyncTask.
-
doInBackground (Tham số) - Trong phương pháp này chúng ta phải thực hiện thao tác nền trên luồng nền. Các hoạt động trong phương pháp này không được chạm vào bất kỳ hoạt động hoặc phân đoạn bảo trì nào.
-
onProgressUpdate (Tiến trình…) - Trong khi thực hiện thao tác nền, nếu bạn muốn cập nhật một số thông tin trên giao diện người dùng, chúng ta có thể sử dụng phương pháp này.
-
onPostExecute (Kết quả) - Trong phương pháp này, chúng tôi có thể cập nhật ui của kết quả hoạt động nền.
Loại Chung trong Tác vụ Không đồng bộ
-
TypeOfVarArgParams - Nó chứa thông tin về loại tham số được sử dụng để thực thi.
-
ProgressValue - Nó chứa thông tin về các đơn vị tiến độ. Trong khi thực hiện thao tác nền, chúng ta có thể cập nhật thông tin về ui bằng onProgressUpdate ().
-
Giá trị kết quả −Nó chứa thông tin về loại kết quả.
Ví dụ này minh họa về cách sử dụng asyncTask trong android.
Bước 1 - Tạo một dự án mới trong Android Studio, đi tới Tệp ⇒ Dự án Mới và điền tất cả các chi tiết cần thiết để tạo một dự án mới.
Bước 2 - Thêm mã sau vào res / layout / activity_main.xml.
<?xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns:android = "https://schemas.android.com/apk/res/android" xmlns:tools = "https://schemas.android.com/tools" android:id = "@+id/rootview" android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" android:background = "#c1c1c1" android:gravity = "center_horizontal" tools:context = ".MainActivity"> <Button android:id = "@+id/asyncTask" android:text = "Download" android:layout_width = "wrap_content" android:layout_height = "wrap_content" /> <ImageView android:id = "@+id/image" android:layout_width = "300dp" android:layout_height = "300dp" /> </LinearLayout>
Trong xml ở trên, chúng tôi đã tạo một nút, khi người dùng nhấp vào nút, nó sẽ tải xuống hình ảnh và nối hình ảnh vào imageview.
Bước 3 - Thêm mã sau vào src / MainActivity.java
package com.example.andy.myapplication; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class MainActivity extends AppCompatActivity { URL ImageUrl = null; InputStream is = null; Bitmap bmImg = null; ImageView imageView= null; ProgressDialog p; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button=findViewById(R.id.asyncTask); imageView=findViewById(R.id.image); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AsyncTaskExample asyncTask=new AsyncTaskExample(); asyncTask.execute("https://www.tutorialspoint.com/images/tp-logo-diamond.png"); } }); } private class AsyncTaskExample extends AsyncTask<String, String, Bitmap> { @Override protected void onPreExecute() { super.onPreExecute(); p = new ProgressDialog(MainActivity.this); p.setMessage("Please wait...It is downloading"); p.setIndeterminate(false); p.setCancelable(false); p.show(); } @Override protected Bitmap doInBackground(String... strings) { try { ImageUrl = new URL(strings[0]); HttpURLConnection conn = (HttpURLConnection) ImageUrl.openConnection(); conn.setDoInput(true); conn.connect(); is = conn.getInputStream(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; bmImg = BitmapFactory.decodeStream(is, null, options); } catch (IOException e) { e.printStackTrace(); } return bmImg; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if(imageView!=null) { p.hide(); imageView.setImageBitmap(bitmap); }else { p.show(); } } } }
Trong đoạn mã trên, chúng tôi đang tải xuống hình ảnh bằng asyncTask và thêm hình ảnh vào imageview.
Bước 4 - Thêm mã sau vào tệp kê khai.xml
<?xml version = "1.0" encoding = "utf-8"?> <manifest xmlns:android = "https://schemas.android.com/apk/res/android" package = "com.example.andy.myapplication"> <uses-permission android:name = "android.permission.INTERNET"/> <application android:allowBackup = "true" android:icon = "@mipmap/ic_launcher" android:label = "@string/app_name" android:roundIcon = "@mipmap/ic_launcher_round" android:supportsRtl = "true" android:theme = "@style/AppTheme"> <activity android:name = ".MainActivity"> <intent-filter> <action android:name = "android.intent.action.MAIN" /> <category android:name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Trong tệp AndroidManifest.xml ở trên, chúng tôi đã thêm quyền truy cập internet để truy cập internet để tải xuống hình ảnh.
Hãy thử chạy ứng dụng của bạn. Tôi giả sử bạn đã kết nối thiết bị Di động Android thực tế với máy tính của mình. Để chạy ứng dụng từ android studio, hãy mở một trong các tệp hoạt động của dự án của bạn và nhấp vào biểu tượng Run Eclipse Run Icon từ thanh công cụ. Chọn thiết bị di động của bạn làm tùy chọn, sau đó kiểm tra thiết bị di động sẽ hiển thị màn hình mặc định của bạn.
Bây giờ nhấp vào nút tải xuống, nó sẽ hiển thị tiến trình trên giao diện người dùng và tải xuống hình ảnh ở nền như hình dưới đây
Sau khi tải hình ảnh xuống, nó sẽ cập nhật trên giao diện người dùng như hình dưới đây