Đa tiến trình trong android

     
khóa huấn luyện Lập trình lập trình Android khóa học lập trình game android cơ phiên bản Xử lý bất đồng bộ trong lập trình game android cơ phiên bản

Dẫn nhập

Ở những bài học tập trước, họ đã thuộc nhau tìm hiểu về ANIMATION & CÁC HIỆU ỨNG ĐƠN GIẢN trong ANDROID.Tiếp theo ở bài học này họ sẽ đề cập cho một khía cạnh đặc biệt khác trong lập trình sẵn Android, chính là xử lý bất đồng bộ. Bài tiếp theo nữa cũng trở thành liên quan lại nên các bạn hãy chú ý kỹ nhé!

Nội dung

Để gọi hiểu bài xích này xuất sắc nhất các bạn nên có kỹ năng và kiến thức cơ bạn dạng về các phần:

Biết trước về Thread và Handler (2 quan niệm cơ phiên bản trong Java concurrency).Bình tĩnh, từ bỏ tin.

Bạn đang xem: đa tiến trình trong android

Trong bài học kinh nghiệm này, họ sẽ cùng tìm hiểu các vấn đề:

ANR.Làm quen với lỗi làm việc mạng phổ biến.Làm ví dụ xử lý tải về thông tin bên trên mạng với hiển thị về máy.

ANR

ANR là viết tắt của Application Not Responding (Ứng dụng không phản hồi).

Nếu đã từng có lần sử dụng đồ vật Android chắc hẳn bạn cũng đã ít độc nhất một lần gặp mặt phải cái nào đó tương tự cố này:

*

Nguyên nhân hoàn toàn có thể do rất nhiều: Lỗi null, những exception được phun ra tuy thế không xử lý,… Hoặc là:

Không gồm phản hồi cho những sự khiếu nại xuất / nhập thông tin (ghi dữ liệu vào cỗ nhớ, nhập văn bản,…). Nói đơn giản và dễ dàng là TREO máy.Broadcast Receiver không ngừng trong vòng 10 giây.Với những máy Androdi 3.1 về trước: thao tác liên quan đến mạng vượt 5 giây. Sau phiên phiên bản 3.1 thì Google đang cấm tiệt làm việc mạng bên trên Main Thread.

Về cơ phiên bản là như vậy. Tuy nhiên, hẳn các bạn sẽ tự hỏi…

Main Thread và Worker Thread là gì?

Mình đã giới thiệu ở bài đầu tiên, game android là hệ quản lý và điều hành đa tiến trình, đa luồng. Những ứng dụng app android cũng rất có thể sử dụng được nhiều thread (luồng) khoáng sản hệ thống.

Tuy nhiên các thành phần liên quan đến giao diện người tiêu dùng đều được nhét chung vào một trong những thread chính, gọi là UI Thread (hay Main Thread).

Các thao tác xử lý nặng phần lớn đều bị cấm thực hiện trên Main Thread vị sẽ gây nên trải nghiệm xấu cho tất cả những người dùng (bấm nút mãi ko lên, chạy mãi cứ treo là hư rồi, bạn ta sẽ xóa tiện ích ngay). Vì chưng đó bọn họ cần đưa các tác vụ này vào một Thread khác, gọi là Worker Thread.

*

Và kế tiếp là update vào Main Thread. Bí quyết làm này được điện thoại tư vấn là thao tác xử lý bất đồng hóa (Asynchronous).

Trăm nghe không bằng một thấy, chúng ta sẽ chế biến thử ví dụ nho nhỏ. Là tải về thông tin dạng String từ một site bất kỳ, tiếp đến in ra màn hình Android, từ trên Main Thread lẫn Worker Thread xem bọn chúng thực sự ra làm sao nhé.

ANR với thao tác làm việc mạng bên trên Main Thread.

Bước 1: Như hầu hết khi, chúng ta tạo một project mới với tên là AsyncExample với API là 13 và một số loại Activity là Empty Activity.

*

Bước 2: Để cho đối kháng giản, tài liệu của bọn họ sẽ đem từ trang icanhazip.com. Vào trang này các các bạn sẽ thấy địa chỉ cửa hàng IP của bản thân mình hiện ra. Và chúng ta sẽ để một TextView cho hiển thị địa chỉ này lên Activity.

Activity_main.xml

Bước 3: Trong MainActivity.java, họ sẽ viết một hàm đơn giản, download thông tin từ bỏ icanhazip về và đổ vào TextView, tên hàm là testNetwork():

MainActivity.java

package com.giayphutyeuthuong.vn.asyncexample;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.widget.TextView;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;public class MainActivity extends AppCompatActivity TextView tvIP;
Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvIP = (TextView) findViewById(R.id.tv_ip); testNetwork(); private void testNetwork() try StringBuilder sb; // website này sẽ mang lại biết add IP của bạn. URL url = new URL("http://icanhazip.com/"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) sb.append(line).append(" "); tvIP.setText(sb.toString()); Log.e("Dia bỏ ra IP ", sb.toString()); br.close(); catch (IOException e) e.printStackTrace(); Nhớ để Permission internet trong tệp tin AndroidManifest.xml

Và tất nhiên là chương trình sẽ bị crash rồi, bởi vì hàm testNetwork được gọi ngay vào UI Thread mà:

*

Và khi chú ý vào log, bạn sẽ thấy NetworkOnMainThreadException:

*

Vậy phải làm thế nào đây?

AsyncTask

Nói về cách xử lý bất đồng hóa thì quả thật không 1-1 giản. Mình cũng thừa nhấn là mình cực kỳ gà sinh hoạt khoản này. Nhưng suôn sẻ thay là android có một phép tắc giúp đơn giản hóa quy trình xử lý bất đồng bộ hiệu quả, phù hợp với vận dụng nhỏ.

Xem thêm: Lý Thuyết Định Luật Jun - Len-Xơ Lớp 11, Định Luật Jun Len Xơ Là Gì

Đó chính là AsyncTask.

Bước 1: họ tạo một class mới, extends trường đoản cú lớp AsyncTask, tạm điện thoại tư vấn là AsyncTaskNetwork và nó bao gồm dạng ban đầu như sau:

AsyncTaskNetwork.java

package com.giayphutyeuthuong.vn.asyncexample;import android.os.AsyncTask;public class AsyncTaskNetwork extends AsyncTask Vào thực đơn Code > Override Methods nhằm tạo những method đề nghị thiết. Thiệt ra chỉ cần doInBackground nhưng theo mình, buộc phải tạo method theo lắp thêm tự sau: onPreExecute, doInBackground onPostExecute:

Và nó có dạng như này:

AsyncTaskNetwork.java

package com.giayphutyeuthuong.vn.asyncexample;import android.os.AsyncTask;public class AsyncTaskNetwork extends AsyncTask
Override protected void onPostExecute(Boolean aBoolean) super.onPostExecute(aBoolean); Phần này tương đối khó hiểu. Chúng ta lưu ý nhé: họ có 3 phần:

onPreExecute: Tác vụ này vẫn chạy nghỉ ngơi UI Thread, nó vẫn chạy trước khi bước đầu tác vụ ngẫu nhiên nào đó trong doInBackground. Tương thích nhất là đặt ở chỗ này một ProgressDialog (một thông báo nhỏ quay quay) để cho người dùng biết là đang xuất hiện tác vụ xử lý.doInBackground: Đây chính là cái bọn họ cần. Các làm việc về mạng sẽ được đặt vô đây. doInBackground là task chạy trên Worker Thread.onPostExecute: Tác vụ này chạy nghỉ ngơi UI Thread, họ sẽ cho dừng ProgressDialog ở đây, bên cạnh đó lấy tài liệu từ doInBackground về sau khoản thời gian xử lý.

Các bạn có suy nghĩ các nơi bôi color chữ không? Đó chủ yếu là:

String: Đây là kiểu tài liệu được truyền vào doInBackground.Void: Đây là kiểu tài liệu mà ta truyền vào trong 1 hàm đặc biệt có tên publishProgress(). Hàm này có sẵn vào lớp AsyncTask nhưng họ không sử dụng đến. Nó cần sử dụng để cập nhật xem tác vụ sẽ chạy đến đâu rồi.Boolean: Kiểu dữ liệu trả sau đây khi dứt AsyncTask. Ở trên đây mình đặt Boolean để thông báo: Tác vụ cách xử trí mạng có thành công xuất sắc hay không.

Và chúng ta có class AsyncTask hoàn hảo như cố gắng này, lưu ý kỹ nơi string<0>:

package com.giayphutyeuthuong.vn.asyncexample;import android.app.ProgressDialog;import android.content.Context;import android.os.AsyncTask;import android.util.Log;import android.widget.TextView;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;public class AsyncTaskNetwork extends AsyncTask ProgressDialog progressDialog; Context context; TextView textView; public AsyncTaskNetwork(Context context, TextView textView) this.context = context; this.textView = textView;
Override protected void onPreExecute() super.onPreExecute(); // Hiển thị Dialog khi bước đầu xử lý. ProgressDialog = new ProgressDialog(context); progressDialog.setTitle("giayphutyeuthuong.vn"); progressDialog.setMessage("Dang xu ly..."); progressDialog.show();
Override protected String doInBackground(String... Strings) try StringBuilder sb; // website này sẽ mang đến biết địa chỉ cửa hàng IP của bạn. URL url = new URL(strings<0>); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) sb.append(line).append(" "); Log.e("Dia chi IP ", sb.toString()); br.close(); return sb.toString(); catch (IOException e) e.printStackTrace(); return null; return null;
Override protected void onPostExecute(String aString) super.onPostExecute(aString); // bỏ dialog đi. ProgressDialog.dismiss(); // Hiển thị IP lên TextView. TextView.setText(aString); Quay lại MainActivity. Cách vận dụng AsyncTask rất đơn giản và dễ dàng như sau, chú ý phần thông số của execute:

package com.giayphutyeuthuong.vn.asyncexample;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.TextView;public class MainActivity extends AppCompatActivity TextView tvIP;
Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvIP = (TextView) findViewById(R.id.tv_ip); new AsyncTaskNetwork(this, tvIP).execute("http://icanhazip.com/"); Đó, 2 phần tham số bản thân đã khắc ghi tô đậm màu vàng. Cái địa chỉ kia chính là tham số thứ nhất trong mảng string… của AsyncTask (phần tử 0). Bạn có thể truyền vào bao nhiêu tham số cũng được, nhưng buộc phải cùng mẫu mã và cách xử lý chu đáo.

Chạy app, và bọn họ có được:

*

Lưu ý là IP bên trên là của mình, của các bạn có thể khác.

Kết luận

Qua bài này chúng ta đã ráng được AsyncTask là gì, cơ chế yêu cầu xử lý tác vụ mạng trên Worker Thread của Android.

Chúng ta sẽ tìm hiểu sâu hơn về thao tác làm việc với mạng bằng Moshi với thư viện OkHttp qua bài JSON & WEB API trong LẬP TRINH ANDROID

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại comment hoặc góp ý của mình để phát triển nội dung bài viết tốt hơn. Đừng quên “Luyện tập – thách thức – không lo khó”.

Xem thêm: Lý Thuyết Sử 11 Bài 11 /Phần 2/Chương 2/Bài 11, Lịch Sử 11/Phần 2/Chương 2/Bài 11

Thảo luận

Nếu các bạn có bất kỳ khó khăn hay vướng mắc gì về khóa học, đừng e dè đặt thắc mắc trong phần BÌNH LUẬN bên dưới hoặc vào mục HỎI và ĐÁP trên tủ sách giayphutyeuthuong.vn.com để nhận ra sự hỗ trợ từ cùng đồng.