2011-11-10 48 views
10

Tôi có một dự án cho HoneyComb và tôi gặp lỗi sau khi sử dụng phương thức createe() tại phương thức onResum() trong Hoạt động chính của tôi.thực hiện tạm dừng hoạt động không được tiếp tục sau khi tạo lại phương thức

11-10 22:05:42.090: E/ActivityThread(1917): Performing pause of activity that is not  resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main} 
11-10 22:05:42.090: E/ActivityThread(1917): java.lang.RuntimeException: Performing pause of activity that is not resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main} 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2517) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2505) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2483) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread.access$700(ActivityThread.java:122) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.os.Looper.loop(Looper.java:132) 
11-10 22:05:42.090: E/ActivityThread(1917):  at android.app.ActivityThread.main(ActivityThread.java:4123) 
11-10 22:05:42.090: E/ActivityThread(1917):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-10 22:05:42.090: E/ActivityThread(1917):  at java.lang.reflect.Method.invoke(Method.java:491) 
11-10 22:05:42.090: E/ActivityThread(1917):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
11-10 22:05:42.090: E/ActivityThread(1917):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
11-10 22:05:42.090: E/ActivityThread(1917):  at dalvik.system.NativeStart.main(Native Method) 

Tôi tạo dự án mới để cho bạn biết điều gì đang xảy ra.

Bạn có thể tìm thấy nó ở http://xp-dev.com/svn/RecreateError/trunk/

Tôi không biết là lỗi của tôi là những gì nhưng tôi bắt đầu hoạt động và đăng nhập vòng đời của hoạt động. Kết quả:

11-10 22:26:45.960: I/seasons log(2274): onCreate() 
11-10 22:26:45.990: I/seasons log(2274): onStart() 
11-10 22:26:45.990: I/seasons log(2274): onResume() 

Bây giờ tôi nhấn Action Bar Icon để kích hoạt lá cờ tái tạo và thay đổi để ứng dụng khác ...

11-10 22:30:26.390: I/seasons log(2274): onPause() 
11-10 22:30:27.080: I/seasons log(2274): onStop() 

Và trở lại Hoạt động của tôi với cờ tái kích hoạt những gì sẽ thực hiện tạo lại() tại onResume().

11-10 22:33:05.500: I/seasons log(2274): onCreate() 
11-10 22:33:05.510: I/seasons log(2274): onStart() 
11-10 22:33:05.510: I/seasons log(2274): onResume() 
11-10 22:33:05.510: I/seasons log(2274): onPause() 

onPause? Nhưng hoạt động của tôi có thể nhìn thấy, những gì tôi đang làm sai? Trạng thái chính xác không phải là onResume()?

Và bây giờ nếu tôi đổi sang một ứng dụng khác, tôi sẽ gặp lỗi.

Cảm ơn bạn đã dành thời gian và xin lỗi vì tiếng Anh không tốt của tôi.


Tại thời điểm này, tôi không hiểu cách các ứng dụng như Trình quản lý tệp HD thực hiện hành động này.

Hai hoạt động: Hoạt động chính A, Hoạt động B với Sở thíchPhân tích làm nội dung chính.

Một lựa chọn thay đổi theme giữa Holo và Holo.Light, Hoạt động B thay đổi với một phương pháp OnSharedPreferenceChangeListener trong PreferenceFragment nhưng khi chúng tôi quay trở lại Hoạt động chính recreate() phương pháp tại onResume() thất bại, làm thế nào để làm điều này?

Tôi rất bối rối. Lấy làm tiếc.

Trả lời

0

Tôi không biết đây có phải là nguyên nhân gây ra sự cố của bạn hay không nhưng bạn không so sánh các chuỗi như thế này trong Java;

protected void onResume() { 
    ... 
    if (recreate == "S") { 
     recreate = "N"; 
     recreate(); 
    } 

Sử dụng if ("S".equals(recreate)) để thay thế.

+0

Ups. Trong ứng dụng thực, mã này không tồn tại nhưng cảm ơn bạn. Một sai lầm lớn đối với tôi. – seasonsend

0

Bạn sẽ không bao giờ tự gọi số onPause onCreate onResume v.v. Bạn không cần phải sử dụng recreate() cho những gì bạn muốn làm, đặt mã khởi tạo ở nơi khác nếu cần cập nhật. Ngoài ra, hãy sử dụng số nguyên để lưu trữ trạng thái của chương trình thay vì một chuỗi, sau đó khai báo một số biến cuối cùng để tham chiếu, ví dụ:

public final int RECREATE_ON = 1; 
public final int RECREATE_OFF = 2; 
private int recreate = RECREATE_OFF; 

... 

if(recreate==RECREATE_ON){ 
    recreate(); 
} 

Hãy nhớ những gì tái tạo() được thực hiện:

Nguyên nhân

Hoạt động này phải được tái tạo với một trường hợp mới.Điều này dẫn đến kết quả giống như khi hoạt động được tạo do thay đổi cấu hình - phiên bản hiện tại sẽ trải qua vòng đời để onDestroy() và một phiên bản mới được tạo sau đó.

Đây là lý do bạn nhận được thông báo .

+1

Tôi không gọi onPause, onCreate, onResume trên của riêng tôi. Nhưng hàng năm là đúng với tái tạo. Tôi sử dụng điều này trong ứng dụng của tôi bởi vì trên một PreferenceFragment tôi thay đổi chủ đề giữa holo và Holo.light và tôi cần phải tạo lại các hoạt động khi trở lại để xem thay đổi. – seasonsend

+1

Tôi nghĩ bạn không nên quyết định những gì người khác cần. Nếu bạn không biết một giải pháp, chỉ cần không trả lời. – Michael

3

Để làm điều này, sử dụng một handler:

Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      if(msg.what==MSG_RECREATE) 
       recreate(); 
     } 
}; 

@Override 
protected void onResume() { 
    if(condition) { 
     Message msg = handler.obtainMessage(); 
     msg.what = MSG_RECREATE; 
     handler.sendMessage(msg); 
    } 
} 

này sẽ không sụp đổ nữa.

+4

Tôi tin rằng nó vẫn sẽ bị lỗi, nếu bạn không gọi 'super.onResume()' :) – nicopico

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