Context trong android là gì

      43

Như chúng ta đã biết, dù cho họ truy cập cho tới một View hoặc các tài nguyên hệ thống (Asset), phần lớn chúng ta đều tham chiếu cho một Context. Hôm nay bạn thích trình bày với các bạn về Context trong Android.Bạn sẽ xem: Context trong app android là gì

Bạn bao gồm công dấn là các bạn gọi rất nhiều đến Context trong áp dụng không? Vậy chúng ta đã hiểu bản chất của content trong game android là gì chưa? cùng có khi nào bạn bị lưu ý là dùng Context ko đúng sẽ làm áp dụng bị Memory Leak chưa?

Bài viết này, chúng ta sẽ cùng đi kiếm cội mối cung cấp của Context nhé!


*

Context trong game android là gì?

Theo documentation của Google:

Context is an interface lớn global information about an application environment. This is an abstract class whose implementation is provided by the android system. It allows access to application-specific resources và classes, as well as up-calls for application-level operations such as launching activities, broadcasting & receiving intents, etc.

Tạm dịch:

Context là 1 interface cất thông tin toàn cục về môi trường xung quanh ứng dụng. Đây là 1 lớp trừu tượng được thực hiện bởi khối hệ thống Android. Nó cho phép truy cập đến các tài nguyên và các lớp vận dụng cụ thể, cũng tương tự gọi đến những tác vụ trên mức vận dụng như khởi chạy những activity, gửi với nhận intents, v.v..

Bạn đang xem: Context trong android là gì

Nói biện pháp khác, bọn họ đều vẫn biết và thực hiện nó, trong rất nhiều cách khác nhau. Dẫu vậy thường là sai bí quyết hoặc đều không suy nghĩ các bài toán Garbage Collector (GC – trình dọn rác của JVM) sẽ lau chùi context như làm sao v.v.. Dẫn tới việc bị leak memory…

Cứ bình tĩnh, bọn họ sẽ liên tiếp tìm hiểu bên dưới nhé

Có bao nhiêu phương pháp để gọi Context vào Android

Có các cách nào để hoàn toàn có thể get được một context?

Theo tởm nghiệm bản thân thì có một giải pháp gọi như sau:

this / getActivity()getContext()getBaseContext()getApplicationContext()

this ở đây chính là Activity hiện tại. Ví dụ, hàm hiển thị Toast thân quen thuộc:

Toast.makeText(this, "Boom!", Toast.LENGTH_LONG).show();getContext() là một trong những hàm của lớp View, sẽ cảm nhận context hiện tại của View đó.

getBaseContext() là một trường hợp đặc biệt. Bí quyết gọi này không nhiều thông dụng cơ mà không có nghĩa là hoàn toàn vô dụng. Nó chỉ sử dụng khi chúng ta biết rõ nó là gì, và gồm lý do chính đáng để sử dụng. Đơn cử như bạn muốn override một Context bởi một context khác.

getApplicationContext() được sử dụng ở mọi nơi mà các bạn không ân cần hoặc không cần phải truy cập mang lại context của activity. đa số gì bạn có nhu cầu là thông tin của context trong áp dụng của bạn.

Lưu ý này: các bạn phải rất thận trọng để không giữ context vĩnh viễn cần thiết. Đặc biệt là với những activity. Cực kỳ tiếc là vớ cả họ đều phạm lỗi này bằng cách tạo ra những anonymous inner classes với cùng một tham chiếu mạnh khỏe (strong reference) cho Context trong Android.

Mình rước ví dụ điển hiển kia là gọi Context trong AsyncTask.

AsyncTasks là giải pháp mà việc xúc tiến không dừng lại sau khi activity bị hủy. Do đó, garbage collector ko thể thu hồi nó khi Activity bị hủy. Và nguy cơ tiềm ẩn Memory Leak sẽ xảy ra rất lớn.

Vậy phải làm sao đây?

Như ví dụ mặt dưới, mình sử dụng Handler để đảm bảo an toàn context của Activity không xẩy ra leak. Nhưng bí quyết này khá tốn effort, đặc biệt khi viết một ứng dụng phức tạp. (Đọc thêm bài xích về Handler trong Android nhé)

private static final Handler handler = new Handler();private final Runnable messageTask = new SetMessageTask(this, "This is the message!");private void postTask() handler.postDelayed(messageTask, 8000);private static class SetMessageTask implements Runnable private final WeakReference activity; pivate final String message; SetMessageTask(MainActivity activity, String message) this.activity = new WeakReference(activity); this.message = message; Override public void run() message.isEmpty()) Log.e("SetMessageRunnable", "The message is null!"); return; MainActivity activity = (MainActivity) this.activity.get(); if (activity == null) Log.w("SetMessageRunnable", "Activity is not available anymore."); return; // vày something with activity instance here...

Sử dụng Context vào Fragment

Với việc bổ sung cập nhật fragments, rất nhiều thứ trở nên phức tạp hơn. Chính vì vòng đời của fragments liên kết tới vòng đời của những activity. Điều này gây nên nhiều lỗi về state và transactions, tương tự như việc quản lý stack của ứng dụng.

Đôi khi chúng ta nghĩ transactions của fragments ở không tính hàm onCreate() sẽ tạo ra một exception. Điều này không đúng. Do vì chúng ta cũng có thể thực hiện một transactions trong onPostResume() hoặc trong onResumeFragments().

Xem thêm: Du Hành Giữa Các Vì Sao 2016 Du Hành Các Vì Sao Không Giới Hạn Star Trek Beyond

Tuy nhiên, kia chỉ là tía nơi chúng ta cũng có thể gọi, điều này còn có vẻ hơi giảm bớt nhỉ.


*

Vòng đời của activity cùng thứ từ bỏ gọi các phương thức

Do tài nguyên điện thoại có hạn, đề nghị activity có thể bị hủy bất kể lúc như thế nào bởi hệ thống để hóa giải tài nguyên. Đó là nguyên nhân tại sao bạn không nên dựa vô số vào context cùng tính khả dụng của nó.

Quy tắc thực hiện Context vào Android

Đôi khi, có những trường hợp rất “nực cười” trong ứng dụng. Ví dụ, việc kiểm soát điều hành hiển thị view với load data cho view trong cùng một hàm (bạn cấm kị điều này nhé, chỉ ví dụ như thui!).

Khi cơ mà việc xáo trộn giữa khai báo view cùng tải dữ liệu cho view đó cũng trong 1 hàm. Điều này làm phần lớn thứ phụ thuộc lẫn nhau dẫn đến khó kiểm soát.

Bạn rất có thể bị sa đà vào câu hỏi code hồ hết thứ trong onCreateView()… cùng sự xuất hiện của Fragments chỉ khiến ra những vấn đề thêm trầm trọng, đặc biệt là việc sử dụng Context.

Một phần bởi Context không phải lúc cũng sẵn sàng chuẩn bị để hotline được. Chỉ vào onActivityCreated() hoặc onAttach() bọn họ mới chắc chắn là về tính khả dụng của Context.

Ở hình mặt dưới, bạn cũng có thể thấy MainActivity đã biết thành memory leak. Đây là hiệu quả mình sử dụng thư viện LeakCanary để phát hiện nay memory leak


*

MainActivity bị leak memory

6 Quy tắc thực hiện Context vào Android

Tóm lại, để ngăn cản để xảy ra lỗi memory leak khi sử dụng Context, mình đúc kết được một trong những quy tắc như sau:

Sử dụng getContext() hoặc Activity.this khi yêu cầu xử lý đến những Views nằm trên activity.Sử dụng getApplicationContext() nếu bạn cần context ở cấp cho ứng dụng, không tương xứng với bất kỳ view/ activity nào. Ví dụ: sử dụng hàm này cùng với BroadcastReceiver hoặc Service)Không sử dụng getBaseContext(). Khi mà không thực sự hiểu thì cực tốt tìm giải pháp khác bình yên hơnSử dụng WeakReference nếu các bạn cần truy cập đến context từ phía bên trong threads.Không tham chiếu mang đến context của một activity xuất phát từ một activity khác. Tuyệt đối không thực hiện context như một biến chuyển static. Ở trong fragment, gán một context để sử dụng ở vào hàm onAttach(Context context)

Như vậy, họ đã nắm rõ về Context trong app android rồi đúng không? với mình mong muốn với hầu hết quy tắc trên, các bạn sẽ không còn lo lắng về vụ việc memory leak khi áp dụng context nữa