3

Here is strange crash, can anybody explain why it appear.

Crash appear when try to open (by tab or sliding) third fragment in ViewPager (first two initialized at this time automatically) in Log is not many info, and simply suggest to 'Verify'.

When apk created by Android Studio it can not be reproduced, exist only in apk created by TestFairy

STACK_TRACE=java.lang.VerifyError: .../CaseDetailUsersFragment
at ...CaseDetailViewPagerAdapter.getFragment(CaseDetailViewPagerAdapter.java:55)
at ...CaseDetailViewPagerAdapter.getItem(CaseDetailViewPagerAdapter.java:35)
at android.support.v13.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:101)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:836)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1052)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:554)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:494)
at ...CaseDetailViewPagerFragment.onTabSelected(CaseDetailViewPagerFragment.java:148)
at 
...view.MaterialTab.onTouch(MaterialTab.java:191)
at android.view.View.dispatchTouchEvent(View.java:7772)

CaseDetailViewPagerAdapter

public class CaseDetailViewPagerAdapter extends FragmentPagerAdapter{
        /**
         * class Adapter for Tabs in CaseDetail
         */
        public class CaseDetailViewPagerAdapter extends FragmentPagerAdapter{
            private final Context context;
            private String caseId;
            private int numItems;
            public CaseDetailViewPagerAdapter(Context context, FragmentManager fm, String caseId, int numItems) {
                super(fm);
                this.context = context;
                this.caseId = caseId;
                this.numItems = numItems;
            }

            @Override
            public Fragment getItem(int i) {
                return getFragment(i);
            }

            @Override
            public int getCount() {
                return numItems;
            }

            /**
             * @return instance of Fragment accordion to selected position
             */
            private Fragment getFragment(int position) {
                switch (position) {
                    case 0:
                        return CaseDetailLogFragment.newInstance(caseId);
                    case 1:
                        return CaseDetailChecklistFragment.newInstance(caseId);
                    case 2:
    //55 line                    return CaseDetailUsersFragment.newInstance(caseId);
                    case 3:
                        return CaseDetailMapFragment.newInstance(caseId);
                }
                return null;
            }
        }

CaseDetailUsersFragment

public class CaseDetailUsersFragment extends Fragment {

    public static final int USER_LOADER_ID = 3;
    public static final int GROUP_LOADER_ID = 4;
    static final String CASE_ID = "case_id";
    String caseServerId;



    public static CaseDetailUsersFragment newInstance(String caseId) {
        CaseDetailUsersFragment usersFragment = new CaseDetailUsersFragment();
        Bundle bundle = new Bundle();
        bundle.putString(CASE_ID, caseId);
        usersFragment.setArguments(bundle);
        return usersFragment;
    }

@Override
    public void onServiceResult(long requestId, Intent requestIntent, int resultCode, Bundle resultData) {
        super.onServiceResult(requestId, requestIntent, resultCode, resultData);
        if (requestId == requestIdGetCaseUsersCommand && GetCaseUsersCommand.ACTION.equals(requestIntent.getAction())) {
            requestIdGetCaseUsersCommand = BaseServiceHelper.DEFAULT_REQUEST_ID;
            switch (resultCode) {
                case Command.RESULT_SUCCESSFUL:
                    Logger.logD("onServiceResult finish refreshing");
                    Bundle b = new Bundle();
                    b.putString(CASE_ID, caseServerId);
                    getLoaderManager().restartLoader(USER_LOADER_ID, b, usersLoader);
                    showSwipeProgress(false);
                break;
                case Command.RESULT_FAILURE:
                    showSwipeProgress(false);
                    if (!NetworkHelper.isConnected(getActivity())) {
                        Toast.makeText(getActivity(), R.string.notification_error_no_connection, Toast.LENGTH_LONG).show();
                    } else if (resultData != null) {
                        ErrorInfo errorInfo = resultData.getParcelable(TransitionConstant.ERROR_INFO);
                        if (errorInfo != null) {
                            Toast.makeText(getActivity(), errorInfo.getErrorMessage(), Toast.LENGTH_LONG).show();
                        } else {
                            Toast.makeText(getActivity(), getString(R.string.failure_get_case_list_error_code, resultData.getInt(TransitionConstant.STATUS_ERROR_CODE)), Toast.LENGTH_LONG).show();
                        }
                    } else {
                        Toast.makeText(getActivity(), R.string.failure_get_case_list, Toast.LENGTH_LONG).show();
                    }

                break;
                default:
                    break;
            }
        } else if (requestId == requestIdGetCaseGroupsCommand && GetCaseGroupsCommand.ACTION.equals(requestIntent.getAction())) {
            requestIdGetCaseGroupsCommand = BaseServiceHelper.DEFAULT_REQUEST_ID;
            switch (resultCode) {
                case Command.RESULT_SUCCESSFUL:
                    Logger.logD("onServiceResult finish refreshing groups");
                    Bundle b = new Bundle();
                    b.putString(CASE_ID, caseServerId);
                    getLoaderManager().restartLoader(GROUP_LOADER_ID, b, groupLoader);
                break;
                case Command.RESULT_FAILURE:
                    if (!NetworkHelper.isConnected(getActivity())) {
                        Toast.makeText(getActivity(), R.string.notification_error_no_connection, Toast.LENGTH_LONG).show();
                    } else if (resultData != null) {
                        ErrorInfo errorInfo = resultData.getParcelable(TransitionConstant.ERROR_INFO);
                        if (errorInfo != null) {
                            Toast.makeText(getActivity(), errorInfo.getErrorMessage(), Toast.LENGTH_LONG).show();
                        } else {
                            Toast.makeText(getActivity(), getString(R.string.failure_get_case_list_error_code, resultData.getInt(TransitionConstant.STATUS_ERROR_CODE)), Toast.LENGTH_LONG).show();
                        }
                    } else {
                        Toast.makeText(getActivity(), R.string.failure_get_case_list, Toast.LENGTH_LONG).show();
                    }

                break;
                default:
                    break;
            }
        }
    }

compileSdkVersion 22
buildToolsVersion "22.0.1"
minSdkVersion 16
targetSdkVersion 22

Fixed by break onServiceResult() method on two method.

in warnings in TestFairy log was found W/dalvikvm? VFY: rejected Lmy.package/MyClass;.methodV

Oleksandr B
  • 3,400
  • 1
  • 25
  • 28

1 Answers1

1

The reason of this error need find in warnings of dalwik in application logcat For example: W/dalvikvm? VFY: rejected Lmy.package/MyClass;.methodV

In this case need refactor method because your method is too complex. See more detailed answer in : VerifyError - Verifier rejected class

Community
  • 1
  • 1
Konstantin
  • 153
  • 8