2012-04-29 35 views
7

Tôi đã viết một Ứng dụng và bây giờ, đăng bản phát hành, một số người dùng của tôi dường như đang gặp phải một lỗi khó chịu. Một điều mà tôi đơn giản là không thể tái tạo.Android onActivityResult. Biến thành viên đôi khi bị vô hiệu

Tham gia vào đây là ba Hoạt động.

Hoạt động 1: SuperActivity

public abstract class SuperActivity extends Activity 

Hoạt động 2: MainActivity

public class MainActivity extends SuperActivity { 

    private MyObject myMemberVariable;  

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

    //Get the intent that started this activity. I am always providing Extras, so this is never null. 
    Bundle bundle = getIntent().getExtras(); 

    //Set stuff in myMemberVariable from these extras. This never fails either. 
    myMemberVariable = BundleLoader.loadFromBundle(bundle); 

    } 


    @Override 
    public void onListDialogClick(int requestCode, String[] options, int position, String extra) { 
    //THIS is the place where, according to my stacktrace from the DeveloperConsole, the null pointer arises. 
    myMemberVariable.setXY(position); 
    } 

Hoạt động 3: ListDialogActivity

public class ListDialogActivity extends SuperActivity 

là tôi bắt đầu Những gì tôi đang làm gì ở đây các ListDialogActivity từ MainActivity để giới thiệu cho người dùng một vài lựa chọn. Sau khi thực hiện lựa chọn, ListDialogActivity sẽ thiết lập kết quả và sau đó kết thúc. Trong SuperActivity Tôi đã có:

onActivityResult(int requestCode, int resultCode, Intent data) { 
    //if activityRequestCode was ListDialogRequestCode and the Result was RESULT_OK, then call onListDialogClick(..) with the appropriate values. 
} 

Vì vậy, đây là cách onListDialogClick() trong MainActivity tôi được gọi (Vì vậy, bạn có thể chỉ cần nghĩ về nó như một onActivityResult bình thường()). Ở đó, một số ít người dùng gặp ngoại lệ con trỏ null vì myMemberVariable là null.

Tôi không thể hiểu được điều gì đang xảy ra ở đây. Ngoài ra, tôi đang lưu trạng thái cá thể của mình để xử lý xoay vòng điện thoại, nhưng ngay cả khi tôi không, vì onCreate sẽ bị thu hồi, nó vẫn sẽ không bị rỗng, nó sẽ chỉ mất trạng thái của nó và được tái tạo từ Intent ban đầu.

Bất cứ ai có thể vui lòng giải thích cho tôi điều này là có thể và những gì đang xảy ra ở đây? Tôi có hiểu nhầm điều gì đó từ Android không? Tại sao nó chỉ xảy ra với một vài người? Điều gì có thể là lý do cho điều này? Tôi thực sự rất biết ơn vì ngay cả gợi ý nhỏ nhất.

Cảm ơn bạn rất nhiều!

+1

Mọi yếu tố chung với thiết bị này đang diễn ra? – JRaymond

+0

Tôi chưa tìm thấy một yếu tố chung (tôi chắc chắn rằng nó đã xảy ra với một ai đó với một Galaxy S2 với CM9 và một ai đó với HTC một x.) Nhưng khác hơn là tôi không biết vì dev console không chỉ cho tôi các thiết bị mà lỗi phát sinh. – metter

+1

nơi 'myMemberVariable' được khởi tạo? Trong mã tôi có thể thấy nó phải luôn luôn là 'null' bởi vì nó bằng với' MyObject myMemberVariable = null; ' – zapl

Trả lời

10

zapl là chính xác trong đó bạn phải lưu các giá trị trong onSaveInstanceState và trong trường hợp của tôi, tôi đang khôi phục trong onCreate() chạy BEFORE onActivityResult, vì vậy không còn NullPointerExceptions nữa!

Bạn có thể đã sắp xếp điều này ngay bây giờ, nhưng tôi đã gặp nhiều vấn đề với cùng một vấn đề. Ứng dụng của tôi khởi động máy ảnh để chụp ảnh, sau đó sao chép tệp đã chụp vào thư mục hiện hành trong ứng dụng. Thỉnh thoảng khi bức ảnh được chụp, tôi đã nhận được NullPointerExceptions trong onActivityResult.

Tôi mất một thời gian để nhận ra hoạt động này đã bị quản lý bộ nhớ Android bị giết và tái tạo, do đó mất tất cả các biến thành viên của tôi. Điều này là không rõ ràng (mũ tắt cho Android để giết/khôi phục liền mạch như vậy!). Điều này đã xảy ra trên một HTC Desire HD, và rất ngẫu nhiên, nó rất khó để theo dõi.

+0

Cảm ơn rất nhiều vì câu trả lời này! Tôi đã có cùng một vấn đề và tôi đã không thể tìm ra nó. Làm tốt lắm;) –

+1

Chà, 5 năm sau, vẫn còn liên quan, và đã cứu được mông của tôi; cám ơn vì cái này. Một lỗi khó nắm bắt! – pete

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