2014-10-13 17 views
5

Có thực sự cần thiết để sử dụng AndroidObservable.bindActivity(...) trong các trường hợp như hoạt động dưới đây không? Vì bạn vẫn cần hủy đăng ký thủ công theo số onDestroy.RxAndroid: khi nào sử dụng bindActivity và tại sao?

Theo this blog bưu điện, bindActivity là cần thiết để:

bạn không vô tình cố gắng để thay đổi trạng thái sau khi nó có giá trị để làm như vậy

mà -the cách tôi đọc nó- có nghĩa là có thể có vấn đề khi bạn làm một số việc với hoạt động sau khi finish() được gọi và do đó hủy đăng ký onDestroy sẽ quá muộn.

Bất kỳ ai có thể cho tôi ví dụ về việc hủy đăng ký muộn như trong onDestroy có thực sự là vấn đề không?


Nếu bạn nhìn vào the source cho AndroidObservable.java chức năng ngữ sử dụng cho bindActivity là:

private static final Func1<Activity, Boolean> ACTIVITY_VALIDATOR = new Func1<Activity, Boolean>() { 
@Override public Boolean call(Activity activity) { 
     return !activity.isFinishing(); 
    } 
}; 

Nó sẽ không được tốt hơn cũng để kiểm tra các thay đổi cấu hình, như:

private static final Func1<Activity, Boolean> ACTIVITY_VALIDATOR = new Func1<Activity, Boolean>() { 
@Override public Boolean call(Activity activity) { 
     return !activity.isFinishing() && !activity.isChangingConfigurations(); 
    } 
}; 

???


SomeActivity.java

public class SomeActivity extends Activity implements Observer<String> { 
    private Subscription subscription; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     subscription = getObservable().observeOn(AndroidSchedulers.mainThread()).subscribe(this); 

     // or use bindActivity here???? 
     // subscription = AndroidObservable.bindActivity(this, getObservable()).subscribe(this); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     subscription.unsubscribe(); 
    } 

    @Override 
    public void onNext(String s) { 
     // do something with the activity state... 
    } 

    @Override public void onCompleted() {} 
    @Override public void onError(Throwable throwable) {} 
} 

Trả lời

4

Bạn không thể làm giao dịch đoạn sau onSaveInstanceState đã được gọi là, vì vậy nếu bạn đăng ký sẽ mở ra một DialogFragment sau đó làm điều đó trước khi onDestroy nhưng sau onSaveInstanceState sẽ sụp đổ ứng dụng của bạn. Điều này có thể xảy ra nếu Hoạt động đóng và yêu cầu mạng kết thúc mà muốn hiển thị lỗi. Bất cứ điều gì yêu cầu tiết kiệm nhà nước và do đó không thể được gọi sau khi onSaveInstanceState sẽ là một vấn đề.

+0

Xóa câu trả lời! Cảm ơn. –

+0

Có thể bạn không còn ở đây nữa, nhưng có lý do gì để sử dụng DialogFragments thay vì Dialog thuần túy không? Tôi đã faceplanted chống lại lỗi này rất nhiều lần và tại thời điểm này tôi chỉ cần bỏ và quay trở lại những người không được chấp nhận. –

+0

@ MLProgrammer-CiM 'DialogFragment' có vòng đời Fragment thay vì' Dialog' được gắn với hoạt động. Chúng có thể dễ dàng tồn tại luân phiên, không giống như 'Dialog' đơn giản. – GDanger

Các vấn đề liên quan