juniorDev
juniorDev

Reputation: 11

Android App crashes when restoring from background after a long time

im new in programming and i have strange problem.I try to restore app from background afrer long time in the background and have crashe with NullPointerException.

this is the error from logcat

05-06 14:19:28.278: W/~~~~~~~~~~~~~~~~MainActivity(12129): onSaveInstanceState() com.main.MainActivity@43087bb0 fragment: PrivateCabinetFragment{430d2ae0 #0 id=0x7f09005e PrivateCabinetFragment}
05-06 14:19:35.168: E/BaseFragment(13342): onCreate 
05-06 14:19:35.168: D/AndroidRuntime(13342): Shutting down VM
05-06 14:19:35.168: W/dalvikvm(13342): threadid=1: thread exiting with uncaught exception (group=0x4158cba8)
05-06 14:19:35.168: E/AndroidRuntime(13342): FATAL EXCEPTION: main
05-06 14:19:35.168: E/AndroidRuntime(13342): Process: com, PID: 13342
05-06 14:19:35.168: E/AndroidRuntime(13342): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.main.MainActivity}: java.lang.NullPointerException
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.app.ActivityThread.access$800(ActivityThread.java:135)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.os.Handler.dispatchMessage(Handler.java:102)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.os.Looper.loop(Looper.java:136)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.app.ActivityThread.main(ActivityThread.java:5017)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at java.lang.reflect.Method.invokeNative(Native Method)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at java.lang.reflect.Method.invoke(Method.java:515)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at dalvik.system.NativeStart.main(Native Method)
05-06 14:19:35.168: E/AndroidRuntime(13342): Caused by: java.lang.NullPointerException
05-06 14:19:35.168: E/AndroidRuntime(13342):    at com.main.MainActivity.setUnreadedMessages(MainActivity.java:151)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at com.main.PrivateCabinetFragment.onCreate(PrivateCabinetFragment.java:104)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.support.v4.app.Fragment.performCreate(Fragment.java:1437)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:877)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1856)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:210)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at com.main.BaseActivity.onCreate(BaseActivity.java:55)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at com.main.MainActivity.onCreate(MainActivity.java:65)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.app.Activity.performCreate(Activity.java:5231)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-06 14:19:35.168: E/AndroidRuntime(13342):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
05-06 14:19:35.168: E/AndroidRuntime(13342):    ... 11 more

and this is my code

package com.main;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;



   import com.R;
    import com.connection.ActionGetData;
    import com.data.Constants;

public class MainActivity extends BaseActivity implements OnClickListener, DialogInterface.OnCancelListener {
    private final static String CLASS_TAG = MainActivity.class.getSimpleName();
    private Fragment mContent;
    private PrivateCabinetFragment privateCabinetFrag;
    private SettingsFragment settingsFragment;
    private NewOrderMainFragment stayOrderFragment;
    private PopularQuestionListFragment questionsFragment;
    private PaymentsMenu paymentsMenu;
    private MessageMain messageMain;
    private MyRequestOrdersListFragment requestList;
    private ImageView service;
    private ImageView helpAndSupport;
    private ImageView payments;
    private ImageView settings;
    private RelativeLayout btnService;
    private RelativeLayout btnHelpAndSupport;
    private RelativeLayout btnPayments;
    private RelativeLayout btnSettings;
    private RelativeLayout btnMessages;
    private ImageView btnSupportStayOrder;
    private TextView btnSupportRequestOrders;
    private TextView btnSupportPopularQuestion;
    private ImageView messages;
    private TextView tvNewMessages;
    private RelativeLayout dashBoard;
    private LinearLayout toggleButton;
    private Bundle extras;
    private String fragment_tag = "";
    private FragmentManager frag_manager;
    private int onBackpress = 0;
    public static boolean sDisableFragmentAnimations = false;

    protected Animation animUp;
    protected Animation animDown;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        Log.e(CLASS_TAG,"savedInstanceState"+ savedInstanceState);
        if (savedInstanceState != null) {
            Log.e(CLASS_TAG, "savedInstanceState" + savedInstanceState.isEmpty());

            Log.i(CLASS_TAG, "savedInstance != null");
            Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            finish();

        } else {

            setContentView(R.layout.main_activity);
            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
            extras = getIntent().getExtras();
            tvNewMessages = (TextView) findViewById(R.id.tv_new_messages);
            service = (ImageView) findViewById(R.id.iv_services_main_board);

            btnService = (RelativeLayout) findViewById(R.id.rl_services_main_board);
            btnService.setOnClickListener(this);

            helpAndSupport = (ImageView) findViewById(R.id.iv_support_main_board);
            btnHelpAndSupport = (RelativeLayout) findViewById(R.id.rl_support_main_board);
            btnHelpAndSupport.setOnClickListener(this);

            payments = (ImageView) findViewById(R.id.iv_payments_main_board);
            btnPayments = (RelativeLayout) findViewById(R.id.rl_payments_main_board);
            btnPayments.setOnClickListener(this);

            messages = (ImageView) findViewById(R.id.iv_message_main_board);
            btnMessages = (RelativeLayout) findViewById(R.id.rl_message_main_board);
            btnMessages.setOnClickListener(this);

            settings = (ImageView) findViewById(R.id.iv_settings_main_board);
            btnSettings = (RelativeLayout) findViewById(R.id.rl_settings_main_board);
            btnSettings.setOnClickListener(this);

            toggleButton = (LinearLayout) findViewById(R.id.ll_toggle_container);
            toggleButton.setBackgroundDrawable((getResources().getDrawable(R.drawable.top_panel_background)));

            dashBoard = (RelativeLayout) findViewById(R.id.dash_board);

            btnSupportStayOrder = (ImageView) findViewById(R.id.iv_new_order);
            btnSupportStayOrder.setOnClickListener(this);

            btnSupportPopularQuestion = (TextView) findViewById(R.id.tv_popular_questions);
            btnSupportPopularQuestion.setOnClickListener(this);

            btnSupportRequestOrders = (TextView) findViewById(R.id.tv_my_orders);
            btnSupportRequestOrders.setOnClickListener(this);

            questionsFragment = new PopularQuestionListFragment();
            privateCabinetFrag = new PrivateCabinetFragment();
            settingsFragment = new SettingsFragment();
            stayOrderFragment = new NewOrderMainFragment();
            paymentsMenu = new PaymentsMenu();
            messageMain = new MessageMain();
            requestList = new MyRequestOrdersListFragment();
            animUp = AnimationUtils.loadAnimation(this, R.anim.anim_up);
            animDown = AnimationUtils.loadAnimation(this, R.anim.anim_down);
            frag_manager = getSupportFragmentManager();
            service.setBackgroundResource(R.drawable.services_main_board_pressed);
            if (extras != null) {
                boolean payments = extras.getBoolean(Constants.EXTRAS_MAIN_ACTIVITY_PAY_FRAGMENT);
                if (payments) {
                    fragment_tag = PaymentsMenu.class.getSimpleName();
                    pushFragmentsWithoutAnimation(paymentsMenu, fragment_tag);

                }
            } else {
                fragment_tag = PrivateCabinetFragment.class.getSimpleName();
                pushFragmentsWithoutAnimation(privateCabinetFrag, fragment_tag);
            }
        }

    }

public void setUnreadedMessages(int count) {
    if (count > 0) {
        tvNewMessages.setVisibility(View.VISIBLE);

        tvNewMessages.setText(Integer.toString(count));
    } else {
        tvNewMessages.setVisibility(View.INVISIBLE);
    }

}

@Override
protected void onSaveInstanceState(Bundle outState) {

    Log.w("~~~~~~~~~~~~~~~~" + CLASS_TAG, "onSaveInstanceState() " + toString() + " fragment: " + mContent);

    try {
        frag_manager.putFragment(outState, "mContent", mContent);
    } catch (Exception e) {
        Log.e(CLASS_TAG, "!!!!!!!!");
        e.printStackTrace();
    }
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    Log.w("~~~~~~~~~~~~~~~~" + CLASS_TAG, "onRestoreInstanceState() " + toString() + " fragment: " + mContent.getClass().getSimpleName());
    mContent = frag_manager.getFragment(savedInstanceState, "mContent");
    Log.i(CLASS_TAG, "savedInstance != null");


    super.onRestoreInstanceState(savedInstanceState);

}



public void pushFragments(Fragment fragment, String tag) {
    onBackpress = 0;
    String old_tag = "";
    try {
        old_tag = mContent.getClass().getSimpleName();

    } catch (Exception e) {
        e.printStackTrace();
        old_tag = "new";
    }
    mContent = fragment;
    if (old_tag.equals(tag)) {

    } else {
        clearFragments();
        // frag_manager.popBackStack(null,
        // FragmentManager.POP_BACK_STACK_INCLUSIVE);
        FragmentTransaction ft = frag_manager.beginTransaction();

        ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left).replace(R.id.frame_container, fragment, tag);
        ft.commit();
        if (getCurrentFocus() != null) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
    }

}

public void clearFragments() {
    sDisableFragmentAnimations = true;
    frag_manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

}

public void pushFragmentsWithoutAnimation(Fragment fragment, String tag) {
    onBackpress = 0;
    String old_tag = "";
    try {
        old_tag = mContent.getClass().getSimpleName();

    } catch (Exception e) {
        e.printStackTrace();
        old_tag = "new";
    }
    mContent = fragment;
    if (old_tag.equals(tag)) {

    } else {
        clearFragments();
        FragmentTransaction ft = frag_manager.beginTransaction();

        ft.replace(R.id.frame_container, fragment, tag);
        ft.commit();
        if (getCurrentFocus() != null) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
    }
}

public void navigateTo(Fragment fragment) {
    onBackpress = 0;
    mContent = fragment;

    frag_manager.beginTransaction().setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left, R.anim.slide_in_right, R.anim.slide_out_right)
            .replace(R.id.frame_container, fragment).addToBackStack(Integer.toString(frag_manager.getBackStackEntryCount() + 1)).commit();

    if (getCurrentFocus() != null) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }

}

public void navigateBack() {
    Log.v(CLASS_TAG, "navigateBack()");
    onBackpress = 0;

    final int cnt = frag_manager.getBackStackEntryCount();

    Log.v(CLASS_TAG, "stack depth: " + cnt);

    if (cnt >= 1) {

        frag_manager.popBackStack();

        if (getCurrentFocus() != null) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
    } else {
        onBackPressed();
        Log.v(CLASS_TAG, "Can't navigate");
    }
}

@Override
public void onBackPressed() {
    if (clients_Data.getClientAcc().size() < 2) {
        if (onBackpress >= 1) {
            hideProgressDialog();
            if (clients_Data.isLogedIn()) {
                ActionGetData.doLogOut();
                finish();
            }
            super.onBackPressed();
        } else if (onBackpress < 1) {
            Toast.makeText(this, getString(R.string.push_for_exit), Toast.LENGTH_SHORT).show();
        }
        onBackpress++;
    } else {
        super.onBackPressed();
        MainActivity.this.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_right);
    }
}

public void isPayments() {
    hideTopPanel();
    payments.setBackgroundResource(R.drawable.payments_main_board_pressed);
    helpAndSupport.setBackgroundResource(R.drawable.support_main_bord_unpressed);
    messages.setBackgroundResource(R.drawable.message_main_board_unpressed);
    service.setBackgroundResource(R.drawable.services_main_board_unpressed);
    settings.setBackgroundResource(R.drawable.settings_main_board_unpressed);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.rl_support_main_board:

        helpAndSupport.setBackgroundResource(R.drawable.support_main_bord_pressed);

        btnSupportPopularQuestion.setTextColor(getResources().getColor(R.color.top_panel_text_color_selected));
        btnSupportPopularQuestion.setBackgroundColor(getResources().getColor(R.color.top_panel_background_selected));

        btnSupportRequestOrders.setTextColor(getResources().getColor(R.color.top_panel_text_color_unselected));
        btnSupportRequestOrders.setBackgroundColor(getResources().getColor(R.color.top_panel_background_unselected));

        btnSupportStayOrder.setImageResource(R.drawable.stay_order_unselected);

        fragment_tag = PopularQuestionListFragment.class.getSimpleName();

        pushFragments(questionsFragment, fragment_tag);
        messages.setBackgroundResource(R.drawable.message_main_board_unpressed);
        service.setBackgroundResource(R.drawable.services_main_board_unpressed);
        settings.setBackgroundResource(R.drawable.settings_main_board_unpressed);
        payments.setBackgroundResource(R.drawable.payments_main_board_unpressed);

        break;
    case R.id.tv_popular_questions:

        btnSupportPopularQuestion.setTextColor(getResources().getColor(R.color.top_panel_text_color_selected));
        btnSupportPopularQuestion.setBackgroundColor(getResources().getColor(R.color.top_panel_background_selected));

        btnSupportRequestOrders.setBackgroundColor(getResources().getColor(R.color.top_panel_background_unselected));
        btnSupportRequestOrders.setTextColor(getResources().getColor(R.color.top_panel_text_color_unselected));

        btnSupportStayOrder.setImageResource(R.drawable.stay_order_unselected);
        fragment_tag = PopularQuestionListFragment.class.getSimpleName();
        pushFragments(questionsFragment, fragment_tag);
        break;
    case R.id.tv_my_orders:

        btnSupportRequestOrders.setBackgroundColor(getResources().getColor(R.color.top_panel_background_selected));
        btnSupportRequestOrders.setTextColor(getResources().getColor(R.color.top_panel_text_color_selected));

        btnSupportPopularQuestion.setTextColor(getResources().getColor(R.color.top_panel_text_color_unselected));
        btnSupportPopularQuestion.setBackgroundColor(getResources().getColor(R.color.top_panel_background_unselected));

        btnSupportStayOrder.setImageResource(R.drawable.stay_order_unselected);
        fragment_tag = MyRequestOrdersListFragment.class.getSimpleName();
        pushFragments(requestList, fragment_tag);
        break;
    case R.id.iv_new_order:

        btnSupportStayOrder.setImageResource(R.drawable.stay_order_selected);

        btnSupportPopularQuestion.setTextColor(getResources().getColor(R.color.top_panel_text_color_unselected));
        btnSupportPopularQuestion.setBackgroundColor(getResources().getColor(R.color.top_panel_background_unselected));

        btnSupportRequestOrders.setBackgroundColor(getResources().getColor(R.color.top_panel_background_unselected));
        btnSupportRequestOrders.setTextColor(getResources().getColor(R.color.top_panel_text_color_unselected));
        fragment_tag = NewOrderMainFragment.class.getSimpleName();
        pushFragments(stayOrderFragment, fragment_tag);
        break;
    case R.id.rl_payments_main_board:

        hideTopPanel();
        payments.setBackgroundResource(R.drawable.payments_main_board_pressed);
        fragment_tag = PaymentsMenu.class.getSimpleName();
        pushFragments(paymentsMenu, fragment_tag);
        helpAndSupport.setBackgroundResource(R.drawable.support_main_bord_unpressed);
        messages.setBackgroundResource(R.drawable.message_main_board_unpressed);
        service.setBackgroundResource(R.drawable.services_main_board_unpressed);
        settings.setBackgroundResource(R.drawable.settings_main_board_unpressed);

        break;
    case R.id.rl_services_main_board:

        hideTopPanel();
        service.setBackgroundResource(R.drawable.services_main_board_pressed);
        privateCabinetFrag = new PrivateCabinetFragment();
        fragment_tag = PrivateCabinetFragment.class.getSimpleName();
        pushFragments(privateCabinetFrag, fragment_tag);
        helpAndSupport.setBackgroundResource(R.drawable.support_main_bord_unpressed);
        messages.setBackgroundResource(R.drawable.message_main_board_unpressed);
        settings.setBackgroundResource(R.drawable.settings_main_board_unpressed);
        payments.setBackgroundResource(R.drawable.payments_main_board_unpressed);

        break;
    case R.id.rl_settings_main_board:

        hideTopPanel();
        settings.setBackgroundResource(R.drawable.settings_main_board_pressed);
        fragment_tag = SettingsFragment.class.getSimpleName();
        pushFragments(settingsFragment, fragment_tag);
        messages.setBackgroundResource(R.drawable.message_main_board_unpressed);
        service.setBackgroundResource(R.drawable.services_main_board_unpressed);
        payments.setBackgroundResource(R.drawable.payments_main_board_unpressed);
        helpAndSupport.setBackgroundResource(R.drawable.support_main_bord_unpressed);

        break;

    case R.id.rl_message_main_board:

        hideTopPanel();
        messages.setBackgroundResource(R.drawable.message_main_board_pressed);
        service.setBackgroundResource(R.drawable.services_main_board_unpressed);
        payments.setBackgroundResource(R.drawable.payments_main_board_unpressed);
        helpAndSupport.setBackgroundResource(R.drawable.support_main_bord_unpressed);
        settings.setBackgroundResource(R.drawable.settings_main_board_unpressed);
        fragment_tag = MessageMain.class.getSimpleName();
        pushFragments(messageMain, fragment_tag);

        break;

    }

}

public void hideTopPanel() {
    if (dashBoard.isShown()) {
        // dashBoard.startAnimation(animUp);
        dashBoard.setVisibility(View.GONE);
    }
}

public void showTopPanel() {
    if (!dashBoard.isShown()) {
        dashBoard.setVisibility(View.VISIBLE);
        dashBoard.startAnimation(animDown);
    }
}

@Override
protected void onPause() {
    Log.e(CLASS_TAG,"ON onPause");
    // TODO Auto-generated method stub
    super.onPause();
    onBackpress = 0;
}

@Override
protected void onResume() {
    Log.e(CLASS_TAG,"ON onResume");
    // TODO Auto-generated method stub
    super.onResume();
    onBackpress = 0;
}

@Override
protected void onStart() {
    Log.e(CLASS_TAG,"ON Start");
    super.onStart();
}


}

Upvotes: 0

Views: 2121

Answers (1)

laalto
laalto

Reputation: 152817

The stacktrace says you're still in the superclass onCreate() which recreates the fragments and calls back to MainActivity setUnreadedMessages(). At that point member variables such as tvNewMessages are not initialized.

Generally, fragments should not have such dependencies to the hosting activities. Consider reworking the design there.

Upvotes: 1

Related Questions