Paul Trebilcox-Ruiz Jul 22, 2016 Ngoài những cái cơ bản nhất của các ứng dụng Android, tất cả những gì bạn xây dựng sẽ đòi hỏi ít nhất một số tiến trình nền để thực hiện một tác vụ, Điều này là bởi vì Android có một thứ được biết đến như là một timeout ANR (Application Not Responsive), xảy ra khi một tác vụ mất 5 giây hoặc lâu hơn trên tiến trình UI, ngăn chặn ng" /> Paul Trebilcox-Ruiz Jul 22, 2016 Ngoài những cái cơ bản nhất của các ứng dụng Android, tất cả những gì bạn xây dựng sẽ đòi hỏi ít nhất một số tiến trình nền để thực hiện một tác vụ, Điều này là bởi vì Android có một thứ được biết đến như là một timeout ANR (Application Not Responsive), xảy ra khi một tác vụ mất 5 giây hoặc lâu hơn trên tiến trình UI, ngăn chặn ng" />

Đa tiến trình trong android

post-promotion-placement#checkSidebarAdDisplayCondition" data-controller="scroll-position sticky-ad post-promotion-placement ">
*
Paul Trebilcox-Ruiz Jul 22, 2016

Ngoài những chiếc cơ bản nhất của những ứng dụng Android, toàn bộ những gì bạn xây dựng sẽ đòi hỏi ít nhất một trong những tiến trình nền để thực hiện một tác vụ. Điều này là cũng chính vì Android bao gồm một thiết bị được biết đến 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 quy trình UI, chống chặn người tiêu dùng nhập vào cùng gây cho áp dụng bị treo.

Để tránh đ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 mạng hoặc truy vấn vấn cơ sở dữ liệu chậm, vào trong 1 tiến trình khác để không chống cản người dùng liên tục sử dụng ứng dụng của bạn. Mặc dù khái quát toàn vẹn tiến trình là 1 trong chủ đề bự và phức tạp trong khoa học máy tính, nhưng giải đáp này sẽ giới thiệu cho chính mình những khái niệm cốt yếu của tiến trình trong Android, và một vài công cụ bao gồm sẵn sẽ giúp bạn xây dựng các ứng dụng vận động tốt hơn bằng cách sử dụng các tiến trình nền.

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

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

Tìm phát âm về tiến trình

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

Tất cả các thành phần của một áp dụng chạy trong thuộc một quy trình và cách xử trí theo mặc định, tuy nhiên các tiến trình bổ sung cập nhật có thể được tạo thành để di chuyển các công việc ra khỏi tiến trình UI và ngăn ngừa một ANR. Khi kể tới tiến trình trong Android, có hai quy tắc đơn giản cần cần nhớ để giữ lại cho ứng dụng của bạn chuyển động như muốn đợi:

Không chặn tiến trình UI. Đừng nỗ lực truy cập những thành phần giao diện người tiêu dùng Android từ bên phía ngoài các quá trình UI.

Trong khi chúng ta có thể thực hiện nay theo các quy tắc trước tiên chỉ đối kháng giản bằng cách tạo ra một Thread với Runnable mới, thì bài toán xử lý quy tắc máy hai hơi cực nhọc hơn một chút. Hãy cẩn thận đoạn oered.org sau đây:

new Thread(new Runnable() public void run() try Thread.sleep(6000); catch( InterruptedException e ) mTextView.setText("test"); ).start();Mặc mặc dù đoạn oered.org này đã không ảnh hưởng đến quy trình UI trong khi tiến trình ngủ qua thời hạn chờ ANR, thì vấn đề cố gắng tùy chỉnh cấu hình văn bạn dạng cho TextView sẽ tạo cho ứng dụng hình thành lỗi sau:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.May mắn thay, có một vài ba cách đơn giản và dễ dàng để khắc phục điều này. Chúng ta cũng có thể sử dụng cách tiến hành runOnUiThread(Runnable) của android để triển khai oered.org trở lại quá trình 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 chúng ta có thể lấy một đối tượng người 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 mặc dù cả nhị thủ thuật này sẽ giúp đỡ làm mang lại tiến trình buổi giao lưu của bạn được an toàn, mà lại khi ứng dụng của doanh nghiệp trở cần phức tạp hơn thì điều này đã trở nên trở ngại để duy trì.

AsyncTask

Một một trong những công cụ được hỗ trợ bởi game android để giúp làm chủ các quá trình nền phức tạp là AsyncTask. AsyncTask hỗ trợ một tiến trình quá trình cho các hoạt động ngăn chặn, và sau đó post công dụng về tiến trình UI cùng với một cách làm callback chế tạo ra sẵn, có thể chấp nhận được bạn ngừng các tác vụ của bạn dễ dàng mà không cần phải mò mẫm với Thread và Handler.

Vòng đời AsyncTask

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

*
*
*

Phương thức đầu tiên được gọi vì chưng một AsyncTask là onPreExecute(). Thủ tục này chạy trên các bước UI cùng là phương tiện đi lại để thiết lập bất kỳ thành phần giao diện yêu cầu để cho những người dùng hiểu được một cái gì đấy đang xảy ra.

Sau khi chấm dứt onPreExecute(), doInBackground(T) được gọi. Thông số chung ở chỗ này là bất kỳ thông tin làm sao mà bạn phải truyền vào 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 bạn đang viết một tác vụ truy vấn JSON xuất phát điểm từ 1 URL, bạn sẽ truyền URL vào phương thức này như là một trong String. Tiếp theo là hoạt động tiến hành phía bên trong doInBackground(), bạn có thể gọi onProgressUpdate(T) để cập nhật UI của chúng ta (chẳng hạn như một thanh quá trình trên màn hình). Ở đó là một giá chỉ trị biểu diễn cho tiến độ, chẳng hạn như một Integer.

Một khi thủ tục doInBackground() đã triển khai xong, nó rất có thể trả về một đối tượng người sử dụng được truyền vào vào onPostExecute(T), chẳng hạn như một JSONObject sẽ được tải về tự URL ban đầu của bọn chúng ta. OnPostExecute(T) chạy trên quá trình UI.

Xem thêm: Thông Tin Về Covit 19 - Thông Tin Về Thuốc Tiêm Ngừa Covid

Khi bạn tạo nên một lớp AsyncTask, các bạn phải override đầy đủ phương thức này vào cả định nghĩa lớp và những phương thức sinh hoạt trên. Một lấy ví dụ như về AsyncTask cập nhật một ProgressBar mỗi giây có thể được thấy ngơi nghỉ đâ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ó thể thấy rằng onPostExecute(T) kiểm tra lại isCancelled(). Điều này là bởi vì có một vấn đề lớn với những AsyncTask: chúng duy trì một tham chiếu mang lại một Context ngay lập tức cả sau khoản thời gian Context đó đã trở nên phá hủy.

Điều này dễ nhận thấy nhất khi bước đầu một AsyncTask và tiếp đến xoay màn hình. Nếu bạn nỗ lực 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 lúc đầu đã bị phá hủy, một Exception đang xảy ra. Cách dễ nhất để giải quyết điều này là gọi cancel(true) trên AsyncTask của người sử dụng trong cách tiến hành onDestroy() của Activity hoặc Fragment, cùng sau đó xác thực rằng quá trình đã không trở nên hủy bỏ trong onPostExecute(T).

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

Service

Khi bạn phải thực hiện nay một tác vụ lâu năm chạy trong nền, chẳng hạn như chơi nhạc, triển khai các giao dịch thanh toán mạng hoặc tương tác với một nhà cung ứng nội dung, thì bạn cũng có thể cần coi xét áp dụng một Service. Một Service cơ bản có thể mãi mãi ở hai trạng thái: đã bước đầu và bị ràng buộc.

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

Một Service bị ràng buộc giống như như một Service đang bắt đầu, cùng nó cũng cung ứng các callback cho các thành phần khác nhau của ứng dụng mà có thể liên kết cùng với nó. Khi tất cả các thành phần bị ràng buộc đã xong ràng buộc bao gồm nó khỏi Service, thì nó sẽ dừng chủ yếu nó. Điều quan trọng đặc biệt cần để ý là hai cách để chạy một Service không sa thải lẫn nhau—bạn có thể ban đầu một Service mà lại sẽ chạy vô thời hạn và rất có thể có những thành phần liên kết với nó.

IntentService

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

Ngoài bài toán xử lý phân luồng, IntentService cũng xong chính nó một cách auto sau khi tất cả các yêu cầu đã được xử lý. Bởi vì tất cả các chi tiết cài đặt được cách xử trí trong IntentService, vì thế 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 giải đáp này, bạn đã học được không hề ít về quá trình và các giải pháp đa tiến trình trong Android. Cục bộ các cuốn sách đã có viết về các bước trong Android, tuy vậy bây giờ bạn đã sở hữu một nền tảng đối với các tác vụ bao quát và đọc thêm tài liệu hướng dẫn chuyên sâu so với các áp dụng Android phức hợp hơn.