phương pháp onCreate()
của bạn có nhiều lỗ hổng khổng lồ:
1) onCreate
chuẩn bị Hoạt động của bạn - vì vậy không có gì mà bạn làm ở đây sẽ được thực hiện nhìn thấy cho người sử dụng cho đến khi phương pháp này kết thúc! Ví dụ: bạn sẽ không bao giờ có thể thay đổi văn bản của TextView
tại đây hơn ONE thời gian vì chỉ thay đổi cuối cùng mới được hiển thị và do đó hiển thị với người dùng!
2) Hãy nhớ rằng một chương trình Android sẽ - theo mặc định - chỉ chạy trong ONE chỉ! Do đó: không bao giờ sử dụng Thread.sleep()
hoặc Thread.wait()
trong chuỗi chính của bạn chịu trách nhiệm về giao diện người dùng của bạn! (đọc "Keep your App Responsive" để biết thêm thông tin!)
gì khởi tạo của bạn của hoạt động của bạn làm là:
- không có lý do bạn tạo một đối tượng mới
TextView
t
!
- bạn chọn bố cục
TextView
trong biến số t
sau đó.
- bạn thiết lập các nội dung của
t
(nhưng lưu ý: nó sẽ được hiển thị chỉ sauonCreate()
kết thúc và vòng lặp sự kiện chính của ứng dụng của bạn chạy!)
- bạn chờ đợi cho 10 giây trong phương pháp
onCreate
của bạn - không bao giờ được thực hiện vì nó dừng tất cả hoạt động giao diện người dùng và chắc chắn sẽ buộc ANR (Ứng dụng không phản hồi, xem liên kết ở trên!)
- sau đó bạn đặt một văn bản khác - văn bản này sẽ được hiển thị ngay sau phương pháp
onCreate()
của bạn kết thúc và một số phương pháp khác Activity lifecycle vi đã xử lý!
Giải pháp:
Set văn bản chỉ một lần trong onCreate()
- điều này phải là văn bản đầu tiên mà nên được hiển thị.
Tạo một Runnable
và Handler
private final Runnable mUpdateUITimerTask = new Runnable() {
public void run() {
// do whatever you want to change here, like:
t.setText("Second text to display!");
}
};
private final Handler mHandler = new Handler();
cài đặt Runnable này như một handler, có thể trong onCreate()
(nhưng đọc lời khuyên của tôi dưới đây):
// run the mUpdateUITimerTask's run() method in 10 seconds from now
mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);
Lời khuyên: hãy chắc chắn bạn biết vòng đời của Activity
! Nếu bạn làm những việc như vậy trong onCreate()
, điều này sẽ chỉ xảy ra khi Activity
của bạn được tạo lần đầu tiên thời gian! Android có thể giữ cho số Activity
của bạn hoạt động trong một khoảng thời gian dài hơn, ngay cả khi nó không hiển thị! Khi người dùng "bắt đầu" lại - và nó vẫn tồn tại - bạn sẽ không thấy văn bản đầu tiên của mình nữa!
=> Luôn cài đặt xử lý trong onResume()
và vô hiệu hóa chúng trong onPause()
! Nếu không, bạn sẽ nhận được "cập nhật" khi Activity
của bạn hoàn toàn không hiển thị! Trong trường hợp của bạn, nếu bạn muốn xem lại văn bản đầu tiên khi nó được kích hoạt lại, bạn phải đặt nó trong onResume()
, chứ không phải onCreate()
!
Lý do nó chỉ hiển thị dòng thứ hai là vì '.setText()' thay thế toàn bộ "widget" bằng văn bản bạn yêu cầu nó đặt; BAO GỒM văn bản mà bạn đã đặt ở đó. – georgiaboy82