[Android] Hỏi về release qua progurad
Trường hợp của bạn khá khó để biêt chính xác lý do đến từ đâu, nhưng mình có chút suggestion để bạn thử nhé.
Phân tích
Điều lạ là khi chaỵ debug vẫn ok (Có thể class A ấy ko đc dùng đến), nhưng khi release qua progurad thì nó lại báo lỗi can't find referenced class com.xyz.B
Cái này thì không có gi lạ cả, vì bạn config proguard shrink code khi release mà thôi, debug thì không xài proguard nên nó sẽ không warning.
can't find referenced class com.xyz.B
Lỗi này là một dạng warning của proguard trong một số case. Chẳng hạn như class com.xyz.B
là một phần của java runtime, là file rt.jar
mà không chứa trong android runtime, đc đóng gói thành android.jar
, do đó proguard sẽ warning về case này. Có khá nhiều trường hợp tương tự như thế này, ví dụ như java 8 Stream
sẽ không fully support trong Android.
Cách giải quyết:
Thêm dòng này vào file config proguard
-dontwarn com.xyz.**
hoặc
-dontwarn com.xyz.B
Chú ý
Đừng vội bypass bằng cách thêm -dontwarn
nếu bạn thực sự chưa hiểu rõ về library kia. Ví dụ, một số lib đc viết để chạy trên JRT, chẳng hạn như version 8, và trong lib đó sử dụng một số func trong java 8 ví dụ như Stream
, không được support trong các version Android cũ. Nếu bạn bypass warning từ proguard, app có khả năng crash trên các thiết bị không được support, do đó bạn nên cân nhắc kỹ hoặc chạy test trên các thiết bị thấp để make sure app chạy đúng theo mong muốn
Happy coding~~
Cách sử dụng Asynctask cụ thể trong app
Hi bạn. Để trả lời câu hỏi này, mình giải thích thêm một số khái niệm cơ bản có lẽ sẽ giúp ích cho bạn khi làm Android app sau này.
Android có 2 loại Thread:
- Main thread (UI thread): Thread group xử lý các tác vụ liên quan đến UI.
- Background thread (Worker thread) : Thread group xử lý các tác vụ khác, không liên quan đến UI.
Mặc định Android component như Activity
, Fragment
, Service
chạy trên main thread, và khi có quá nhiều long running task trên thread này, ARN error sẽ xuất hiện, indicate rằng app UI không phản hồi trong thời gian quá lâu, lúc này bạn không thể thao tác với UI hoặc UI lag rất nhiều. Đọc logcat, bạn sẽ thấy dòng info ... to much work on main thread, skip xxx frames
.
Để giải quyết vấn đề này, các tác vụ nặng, cần xử lý nhiều cần thiết phải bring out khỏi main thread. Các đơn giản nhất, bạn có các cách tham khảo sau:
1. Thread allocation
new Thread(() -> {
// Do stuff here
}).start();
Đoạn code trong lamda sẽ run ở background thread và bạn trigger callback khi done.
2. AsyncTask
new AsyncTask<String, Void, Boolean>(){
@Override
protected Boolean doInBackground(String... strings) {
// Running in background
// Do stuff here and return value
return null;
}
@Override
protected void onPreExecute() {
// Run on main thread, update UI or stuffs like that
super.onPreExecute();
}
}.execute();
3. ThreadPoolExecutor
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>(),
(ThreadFactory) Thread::new);
executor.execute(() -> {
// Do stuff here and trigger callback when done
})
Cách này sẽ giúp tối ưu thread sinh ra và manage nó tốt hơn cách 1 khi bạn allocate thread nhưng lost control khi nó đã thực hiện xong.
Gọi ArrayAdapter
this
reference tới current Fragment
instance, ở đây là SearchFragment
. ArrayAdapter
cần pass vào Context
instance, nên modify this
thành getContext()
Bạn Ctrl+Q
để xem document của method rồi pass vào tương ứng.
Hỏi về RxJava
Rx.merge()
operator chạy đồng thời các stream và emit data mỗi khi stream nào trong nó emit data, nghĩa là khi sử dụng merge, data sẽ emit nhiều lần từ những stream khác nhau. Trong case của bạn muốn map các data thành một stream duy nhất thì Rx.zip()
là phù hợp. Các data stream emit sẽ collect lại ở function map trong operator này và bạn chỉ cần implement function map để get final result.
Tổ chức
Chưa có tổ chức nào.