2017-03-13 25 views
30

Gần đây, đôi khi tôi có ngoại lệ này khi MainActivity gọi onResume().java.lang.RuntimeException: Không thể tiếp tục hoạt động với java.lang.IllegalArgumentException

java.lang.RuntimeException: Unable to resume activity {com.qau4d.c35s3.androidapp/com.xxx.XXX.XXX.MainActivity}: java.lang.IllegalArgumentException 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3400) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1510) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6077) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
Caused by: java.lang.IllegalArgumentException 
at android.os.Parcel.readException(Parcel.java:1687) 
at android.os.Parcel.readException(Parcel.java:1636) 
at android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.java:5475) 
at android.app.Activity.isTopOfTask(Activity.java:5961) 
at android.app.Activity.onResume(Activity.java:1252) 
at com.qau4d.c35s3.androidapp.onResume(XActivity.java:29) 
at com.qau4d.c35s3.androidapp.onResume(MainActivity.java:196) 
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1269) 
at android.app.Activity.performResume(Activity.java:6768) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377) 

Cả trong MainActivity và siêu lớp XActivity, chỉ super.onResume();. Nó thực sự kỳ lạ để có được ngoại lệ này sau một thời gian dài phát triển bình thường.Tôi đã kiểm tra một số tài liệu tham khảo tương đối nhưng không có gì có.

+5

Bạn có thể chia sẻ một số mã không? – Cochi

+2

@Keyson Chous, đăng mã những gì bạn đang thực hiện trong 'onResume()' – azizbekian

+1

Phiên bản sdk android bạn đang sử dụng là gì? kể từ khi nó hoạt động bình thường, bạn đã thực hiện những thay đổi nào đối với cấu trúc dự án (Giống như chủ đề ui)? –

Trả lời

3

Không có đủ thông tin trong câu hỏi của bạn để xác định nguyên nhân của java.lang.IllegalArgumentException, Rất tiếc, android ActivityThread không ghi nhật ký ngăn xếp của ngoại lệ đó và thông báo ngoại lệ dường như trống.

Tuy nhiên, có vẻ như có một con đường phía trước. Trường hợp ngoại lệ được xử lý bởi đoạn mã sau vào phương pháp ActivityThread::performResumeActivity:

 } catch (Exception e) { 
      if (!mInstrumentation.onException(r.activity, e)) { 
       throw new RuntimeException(
        "Unable to resume activity " 
        + r.intent.getComponent().toShortString() 
        + ": " + e.toString(), e); 
      } 
     } 

Nếu bạn đăng ký một lớp thiết cho hoạt động của bạn, nó phải là có thể sử dụng một phương pháp onException để đăng nhập stacktrace cho ngoại trừ nguyên nhân .

Điều này sẽ không giải quyết được vấn đề (!) Nhưng nó sẽ giúp bạn tiến gần hơn đến giải pháp.


1 - Google cho "Android instrumentation onException".

0

Trong phương thức Hoạt động # isTopOfTask chúng ta có thể thấy:

private boolean isTopOfTask() { 
    if (mToken == null || mWindow == null) { 
     return false; 
    } 
    try { 
     return ActivityManager.getService().isTopOfTask(getActivityToken()); 
    } catch (RemoteException e) { 
     return false; 
    } 
} 

Và trong ActivityManagerService # isTopOfTask chúng ta có thể tìm thấy:

@Override 
public boolean isTopOfTask(IBinder token) { 
    synchronized (this) { 
     ActivityRecord r = ActivityRecord.isInStackLocked(token); 
     if (r == null) { 
      throw new IllegalArgumentException(); 
     } 
     return r.task.getTopActivity() == r; 
    } 
} 

Vì vậy, tôi nghĩ rằng ActivityRecord là null.But tôi don 't biết tại sao nó là null ....

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