post-promotion-placement#checkSidebarAdDisplayCondition" data-controller="scroll-position sticky-ad post-promotion-placement ">
scroll-to-target-tracking#onClick" data-label="Scroll to lớn top" data-target-selector="#page-body"> Scroll to đứng top
*
Paul Trebilcox-Ruiz Jul 22, năm nhâm thìn

Ngoài các cái cơ bạn dạng nhất của những ứng dụng Android, toàn bộ những gì các bạn xây dựng sẽ đòi hỏi ít nhất một số tiến trình nền để tiến hành một tác vụ. Điều này là bởi vì Android có một máy được nghe biết như là 1 timeout ANR (Application Not Responsive), xảy ra khi một tác vụ mất 5 giây hoặc lâu dài trên quá trình UI, phòng chặn người dùng nhập vào cùng gây cho áp dụng bị treo.

Để né điều này, các bạn phải di chuyển tác vụ chạy lâu, ví dụ điển hình như các yêu cầu mạng hoặc truy vấn cơ sở tài liệu chậm, vào một trong những tiến trình khác để không chống cản tín đồ dùng tiếp tục sử dụng ứng dụng của bạn. Mặc dù khái quát trọn vẹn tiến trình là một trong chủ đề to và phức tạp trong công nghệ máy tính, nhưng khuyên bảo này vẫn giới thiệu cho mình những khái niệm chủ công của tiến trình trong Android, và một trong những công cụ có sẵn sẽ giúp bạn xây dựng các ứng dụng chuyển động tốt hơn bằng cách sử dụng những tiến trình nền.

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

Bạn có thấy tiện lợi hơn khi khám phá bằng video không? tại sao không kiểm tra khóa đào tạo của bọn chúng tôi:

Tìm gọi về tiến trình

Khi một vận dụng được khởi động, một tiến trình Linux new với một luồng tiến trình chính hiếm hoi được bắt đầu. Đây là tiến trình truy cập vào app android UI toolkit, lắng nghe đầu vào từ fan dùng, với xử lý bài toán vẽ lên screen thiết bị Android. Bởi vì vậy, nó cũng thường xuyên được hotline là tiến trình UI.

Tất cả những thành phần của một ứng dụng chạy trong cùng một tiến trình và cách xử lý theo mặc định, thế nhưng các tiến trình bổ sung có thể được tạo nên để di chuyển các quá trình ra khỏi quy trình UI và ngăn ngừa một ANR. Khi nói tới tiến trình vào Android, gồm hai quy tắc dễ dàng cần phải nhớ để giữ lại cho vận dụng của bạn vận động như ước ao đợi:

Không chặn các bước UI. Đừng cố gắng truy cập những thành phần giao diện người dùng Android từ phía bên ngoài các quy trình UI.

Trong khi bạn có thể thực hiện tại theo các quy tắc thứ nhất chỉ đối chọi giản bằng phương pháp tạo ra một Thread cùng Runnable mới, thì việc xử lý quy tắc máy hai hơi khó hơn một chút. Hãy cẩn thận đoạn ustone.com.vn sau đây:

new Thread(new Runnable() public void run() try Thread.sleep(6000); catch( InterruptedException e ) mTextView.setText("test"); ).start();Mặc cho dù đoạn ustone.com.vn này sẽ không tác động đến tiến trình UI trong khi tiến trình ngủ qua thời gian chờ ANR, thì vấn đề cố gắng tùy chỉnh thiết lập văn phiên bản cho TextView sẽ tạo nên ứng dụng ra đời lỗi sau:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can cảm biến its views.May mắn thay, bao gồm một vài cách đơn giản để khắc phục và hạn chế điều này. Bạn có thể sử dụng cách tiến hành runOnUiThread(Runnable) của apk để tiến hành ustone.com.vn trở lại các bước chính của ứng dụng.

mTextView = (TextView) findViewById(R.id.text);new Thread(new Runnable() public void run() try Thread.sleep(6000); catch( InterruptedException e ) runOnUiThread(new Runnable()
Override public void run() mTextView.setText("test"); ); ).start();Hoặc bạn có thể lấy một đối tượng người sử dụng View tiêu chuẩn chỉnh và post một Runnable vào nó.

new Thread(new Runnable() public void run() try Thread.sleep(6000); catch( InterruptedException e ) mTextView.post(new Runnable()
Override public void run() mTextView.setText("test"); ); ).start();Mặc dù cả nhị thủ thuật này sẽ giúp làm mang đến tiến trình hoạt động vui chơi của bạn được an toàn, tuy nhiên khi ứng dụng của chúng ta trở yêu cầu phức tạp hơn thế thì điều này đã trở nên khó khăn để duy trì.

AsyncTask

Một giữa những công cố được cung cấp bởi app android để giúp thống trị các các bước nền phức hợp là AsyncTask. AsyncTask hỗ trợ một tiến trình các bước cho các chuyển động ngăn chặn, và sau đó post tác dụng về các bước UI với một cách thức callback sản xuất sẵn, chất nhận được bạn xong xuôi các tác vụ của người tiêu dùng dễ dàng mà không cần phải mò mẫm với Thread cùng Handler.

Vòng đời AsyncTask

Trước khi bạn bắt đầu sử dụng lớp AsyncTask, bạn sẽ cần cần hiểu vòng đời so với chạy một tác vụ trên quá trình chính.

*
*
*

Phương thức đầu tiên được gọi do một AsyncTask là onPreExecute(). Cách thức này chạy trên quy trình UI cùng là phương tiện đi lại để thiết lập ngẫu nhiên thành phần giao diện yêu cầu để cho người dùng biết rằng một cái gì đấy đang xảy ra.

Sau khi dứt onPreExecute(), doInBackground(T) được gọi. Tham số chung ở chỗ này là bất kỳ thông tin nào mà bạn cần truyền vào cùng với phương thức khiến cho nó để thực hiện nhiệm vụ của mình. Ví dụ, nếu như khách hàng đang viết một tác vụ truy vấn JSON xuất phát từ một URL, bạn sẽ truyền URL vào thủ tục này như là một trong những String. Tiếp sau là hoạt động tiến hành bên phía trong doInBackground(), bạn cũng có thể gọi onProgressUpdate(T) để cập nhật UI của công ty (chẳng hạn như 1 thanh quy trình trên màn hình). Ở đấy là một giá trị màn biểu diễn cho tiến độ, chẳng hạn như một Integer.

Một khi phương thức doInBackground() đã thực hiện xong, nó hoàn toàn có thể trả về một đối tượng người dùng được truyền vào trong onPostExecute(T), ví dụ như một JSONObject đã được download về tự URL ban đầu của bọn chúng ta. OnPostExecute(T) chạy trên các bước UI.

Xem thêm: Review Truyện Chìm Trong Cuộc Yêu Review Chìm Trong Cuộc Yêu Tên

Khi bạn tạo nên một lớp AsyncTask, bạn phải override rất nhiều phương thức này trong cả quan niệm lớp và các phương thức nghỉ ngơi trên. Một lấy một ví dụ về AsyncTask update một ProgressBar từng giây hoàn toàn có thể được thấy sống đây:

protected class DemoAsyncTask extends AsyncTask {
Override protected void onPreExecute() super.onPreExecute(); mProgress.setProgress(0); mProgress.setVisibility(View.Visible);
Override protected void onProgressUpdate(Integer... Values) super.onProgressUpdate(values); mProgress.setProgress(values<0>);
Override protected Void doInBackground(Void... Params) { for( int i = 0; i chúng ta cũng có thể thấy rằng onPostExecute(T) đánh giá lại isCancelled(). Điều này là cũng chính vì có một sự việc lớn với những AsyncTask: chúng gia hạn một tham chiếu đến một Context ngay lập tức cả sau khoản thời gian Context đó đã biết thành phá hủy.

Điều này dễ bắt gặp nhất khi bắt đầu một AsyncTask và sau đó xoay màn hình. Nếu như bạn cố gắng tham chiếu đến một trong những phần tử Context (chẳng hạn như View hoặc Activity) sau khi Context ban sơ đã bị phá hủy, một Exception vẫn xảy ra. Cách dễ nhất để giải quyết điều này là hotline cancel(true) trên AsyncTask của khách hàng trong cách tiến hành onDestroy() của Activity hoặc Fragment, và sau đó chứng thực rằng quá trình đã không bị hủy quăng quật trong onPostExecute(T).

Cũng như với bất cứ điều gì trong lập trình, câu trả lời khi nào bạn nên sử dụng một AsyncTask là: tuỳ. Mặc dù AsyncTask được sử dụng đơn giản, mà lại chúng chưa hẳn là một phương án cho toàn bộ và sau cùng cho tiến trình, và tốt nhất là được thực hiện cho các hoạt động ngắn kéo dãn dài tối đa một vài ba giây. Nếu bạn có một vận động có thể kéo dài, tôi khuyên bạn nghiên cứu sử dụng ThreadPoolExecutor, Service, hoặc GcmNetworkManager (một phiên phiên bản tương say mê ngược của JobScheduler).

Service

Khi bạn cần phải thực hiện tại một tác vụ dài chạy trong nền, ví dụ như chơi nhạc, tiến hành các giao dịch thanh toán mạng hoặc can hệ với một nhà cung cấp nội dung, thì bạn cũng có thể cần xem xét sử dụng một Service. Một Service cơ bản có thể tồn tại ở nhị trạng thái: đã bắt đầu và bị ràng buộc.

Một Service đã bước đầu được khởi động vì chưng một thành phần nằm trong ứng dụng của khách hàng và vẫn còn chuyển động trong nền của thiết bị, thậm chí còn nếu những thành phần ban đầu đã bị hủy. Lúc tác vụ là một Service đã bắt đầu đang thực thi đã hoàn thành, thì Service sẽ dứt chính nó. Một Service đã bước đầu tiêu chuẩn thường được sử dụng cho các tác vụ nhiều năm chạy vào nền mà không buộc phải phải giao tiếp với phần còn lại của ứng dụng.

Một Service bị ràng buộc tương tự như một Service sẽ bắt đầu, với nó cũng hỗ trợ các callback cho những thành phần không giống nhau của ứng dụng mà có thể liên kết cùng với nó. Khi toàn bộ các nguyên tố bị ràng buộc đã dứt ràng buộc chủ yếu nó ngoài Service, thì nó sẽ dừng chính nó. Điều quan trọng cần xem xét là hai cách để chạy một Service không vứt bỏ lẫn nhau—bạn tất cả thể bắt đầu một Service nhưng sẽ chạy vô thời hạn và có thể có các thành phần links với nó.

IntentService

Một giữa những vấn đề to nhất so với một Service tiêu chuẩn chỉnh đó là nó không thể cách xử trí yêu các cầu trên cùng một thời điểm, vấn đề đó sẽ là 1 trong những cơn ác mộng đa luồng. Một phương pháp để giải quyết vấn đề này là quá kế một IntentService, cái mà vượt kế một Service tiêu chuẩn. IntentService tạo ra một tiến trình các bước mặc định để thực hiện tất cả các intent nhận ra trong onStartCommand(), vì đó, tất cả các vận động có thể xẩy ra nằm bên phía ngoài tiến trình chính. Sau đó nó tạo thành một mặt hàng đợi công việc để giữ hộ mỗi intent mang đến onHandleIntent() tại 1 thời điểm vì thế bạn không bắt buộc phải lo lắng về vấn đề đa luồng.

Ngoài câu hỏi xử lý phân luồng, IntentService cũng kết thúc chính nó một cách auto sau khi toàn bộ các yêu ước đã được xử lý. Bởi vì tất cả những chi tiết thiết đặt được cách xử lý trong IntentService, nên nó làm việc đối với bạn khá đối kháng giản.

public class ExampleIntentService extends IntentService //required constructor with a name for the service public ExampleIntentService() super("ExampleIntentService");
Override protected void onHandleIntent(Intent intent) //Perform your tasks here try Thread.sleep(5000); catch (InterruptedException e)

Tổng kết

Trong hướng dẫn này, các bạn đã học tập được không ít về quá trình và các phương án đa các bước trong Android. Tổng thể các cuốn sách đã được viết về tiến trình trong Android, dẫu vậy bây giờ bạn đã có một nền tảng so với các tác vụ tổng thể và gọi thêm tài liệu phía dẫn siêng sâu so với các áp dụng Android phức hợp hơn.