简体   繁体   English

长时间将我的应用程序最小化时,Android NullPointerException

[英]Android NullPointerException when my app was minimized for a long time

My app have crash with NullPointerException when it was for a long time is minimized. 我的应用程序有NullPointerException异常崩溃时,这是很长一段时间最小化。 I think that the problem is in the organization of the fragments. 我认为问题在于片段的组织。

Here is the log cat: 这是日志猫:

08-28 00:49:49.371: E/AndroidRuntime(30333): FATAL EXCEPTION: main
08-28 00:49:49.371: E/AndroidRuntime(30333): Process: com.dimchel.reserwacompras, PID: 30333
08-28 00:49:49.371: E/AndroidRuntime(30333): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dimchel.reserwacompras/com.dimchel.reserwacompras.fragments.MainActivity}: java.lang.NullPointerException
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.app.ActivityThread.access$800(ActivityThread.java:135)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.os.Handler.dispatchMessage(Handler.java:102)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.os.Looper.loop(Looper.java:136)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.app.ActivityThread.main(ActivityThread.java:5001)
08-28 00:49:49.371: E/AndroidRuntime(30333): at java.lang.reflect.Method.invokeNative(Native Method)
08-28 00:49:49.371: E/AndroidRuntime(30333): at java.lang.reflect.Method.invoke(Method.java:515)
08-28 00:49:49.371: E/AndroidRuntime(30333): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
08-28 00:49:49.371: E/AndroidRuntime(30333): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
08-28 00:49:49.371: E/AndroidRuntime(30333): at dalvik.system.NativeStart.main(Native Method)
08-28 00:49:49.371: E/AndroidRuntime(30333): Caused by: java.lang.NullPointerException
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:656)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:570)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.app.Activity.performStart(Activity.java:5241)
08-28 00:49:49.371: E/AndroidRuntime(30333): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)=

And a piece of MainActivity code: public class MainActivity extends ActionBarActivity { static MainActivity thisActivity = null; 和一块MainActivity代码:公共类MainActivity延伸ActionBarActivity {静态MainActivity thisActivity = NULL;

private SiteFragment siteFragment;
public boolean siteCreate;

public String loc = null;
public String url;

public double latitude, longitude;
public boolean loadData = false;

public static ScrollView mainScroll;

public static int displayWidth, oneShit, secondShit;    

private AdvertisementFragment advFragment;
public boolean advCreate;

private ShoppingFragment shoppingFragment;
public boolean createShopping = false;

private LoginFragment loginFragment;
public boolean createCompras = false;

private ComprasFragment comprasFragment;
public boolean createLogin = false;

private AddFragment addFragment;
public boolean createAdd = false;   

public ArrayList<EditFragment> editFragments = new ArrayList<EditFragment>();
public ArrayList<ImageFragment> imageFragments = new ArrayList<ImageFragment>();

public boolean firstBoot = false;

@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    Log.v("gg", "create");

    setContentView(R.layout.activity_main);

    displayWidth = getWindowManager().getDefaultDisplay().getWidth();
    oneShit = (int) getResources().getDimension(R.dimen.paddingRight);
    secondShit = (int) getResources().getDimension(R.dimen.paddingStart);

    mainScroll = (ScrollView) findViewById(R.id.mainScroll);

    ActionBar actionBar = getSupportActionBar();
    actionBar.hide();

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }

    loc = Locale.getDefault().toString().substring(0, 2);
}

@SuppressWarnings("deprecation")
@Override
protected void onResume() 
{

    super.onResume();

    Log.v("gg", "resume");

    displayWidth = getWindowManager().getDefaultDisplay().getWidth();
    oneShit = (int) getResources().getDimension(R.dimen.paddingRight);
    secondShit = (int) getResources().getDimension(R.dimen.paddingStart);

    loc = Locale.getDefault().toString().substring(0, 2);
}

public void createAdvFragment()
{
    advFragment = new AdvertisementFragment();
    getSupportFragmentManager().beginTransaction()
            .add(R.id.startLayout, advFragment)
            .commit();

    advCreate = true;
}


public void deleteAdvFragment()
{
    getSupportFragmentManager() .beginTransaction()
            .remove(advFragment)
            .commit();

    advCreate = false;
}

public void showAdvFragment()
{
    getSupportFragmentManager() .beginTransaction()
            .show(advFragment)
            .commit();
}

public void hideAdvFragment()
{
    getSupportFragmentManager() .beginTransaction()
            .hide(advFragment)
            .commit();
}

public void refreshAdvFragment()
{
    if (advCreate)  advFragment.refresh(loc);
}

public void deleteSiteFragment()
{
    getSupportFragmentManager() .beginTransaction()
            .remove(siteFragment)
            .commit();

    siteCreate = false;
}

public void startApp()
{               
    showTabFragment();
    thisActivity = this;    

    FileManager.loadProfileToStorage(this);

    if (FileManager.loadCategoryFromStorage(this) != null)
        AppDataManager.category = FileManager.loadCategoryFromStorage(this);
    else
    {
        AppDataManager.category.add(new Category("Категории не загружены", -2));
    }
    if (FileManager.loadItemsFromStorage(this) != null)
    {       
        AppDataManager.items = FileManager.loadItemsFromStorage(this);
    }   

    FileManager.loadBootData(this);

    if (firstBoot)
    {
        Log.v("gg", "старт firstboot");
    }
    else
        Log.v("gg", "старт NOOOOOfirstboot");   

    if (AppDataManager.check_login)
    {
        createShoppingFragment();   
    }
    else
    {
        createLoginFragment();
    }       
}

public void createSiteFragment(String txt)
{
    siteFragment = new SiteFragment();

    siteFragment.barText = txt;

    getSupportFragmentManager().beginTransaction()
            .add(R.id.container, siteFragment)
            .commit();

    siteCreate = true;
}

public void showStartFragment()
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    StartFragment startFragment = (StartFragment) fragmentManager.findFragmentById(R.id.startFragment);
    getSupportFragmentManager().beginTransaction()
            .show(startFragment)
            .commit();
}

public void showSiteFragment(String txt)
{
    getSupportFragmentManager().beginTransaction()
            .show(siteFragment)
            .commit();    

    siteFragment.barText = txt;
    siteFragment.loadUrl();

    siteFragment.setBarText(txt);
}

public void hideStartFragment()
{       
    FragmentManager fragmentManager = getSupportFragmentManager();
    StartFragment startFragment = (StartFragment) fragmentManager.findFragmentById(R.id.startFragment);
    getSupportFragmentManager().beginTransaction()
            .hide(startFragment)
            .commit();
}

public void hideSiteFragment()
{
    getSupportFragmentManager().beginTransaction()
            .hide(siteFragment)
            .commit();
}

public void setTabEnabled(boolean shopping, boolean settings)
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    TabFragment tabFragment = (TabFragment) fragmentManager.findFragmentById(R.id.tabFragment);
    tabFragment.setTabEnabled(shopping, settings);
}

public void hideStartFramgnet()
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    StartFragment startFragment = (StartFragment) fragmentManager.findFragmentById(R.id.startFragment);
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(startFragment);
    ft.commit();                
}

public void createComprasFragment()
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

    createCompras = true;
    comprasFragment = new ComprasFragment();

    fragmentTransaction.add(R.id.fragment_container, comprasFragment);
    fragmentTransaction.commit();
}

public void updateLoginFragment()
{
    loginFragment.refreshLoginFragment();
}

public void updateTabFragment(boolean settings, boolean reserva)
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    TabFragment tabFragment = (TabFragment) fragmentManager.findFragmentById(R.id.tabFragment);
    tabFragment.updateTabFramgent(settings, reserva);
}

public void hideTabFragment()
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    TabFragment tabFragment = (TabFragment) fragmentManager.findFragmentById(R.id.tabFragment);
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(tabFragment);
    ft.commit();
}

public void showTabFragment()
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    TabFragment tabFragment = (TabFragment) fragmentManager.findFragmentById(R.id.tabFragment);
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.show(tabFragment);
    ft.commit();
}

public void hideComprasFragment()
{
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(comprasFragment);
    ft.commit();
}

public void showComprasFragment()
{
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.show(comprasFragment);
    ft.commit();
}

@Override
protected void onPause() 
{
    super.onPause();

    if (createAdd == true) removeAddFragment();
    FileManager.saveDataToStorage(this, AppDataManager.items, AppDataManager.category);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
    int id = item.getItemId();
    if (id == R.id.action_settings) 
    {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

public static class PlaceholderFragment extends Fragment 
{

    public PlaceholderFragment() 
    {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) 
    {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        return rootView;
    }
}

} }

Yes, your problem is that you're keeping a long-lived reference to a Fragment with advFragment , and as soon as your Activity is killed (due to Android reclaiming memory or a configuration change). 是的,您的问题是您使用advFragment保留了对Fragment的长期引用,并且一旦Activity被杀死(由于Android回收了内存或更改了配置)。 If you commit a transaction with a null Fragment reference (eg .show(null).commit() ) you'll get that crash. 如果使用零Fragment引用提交事务(例如.show(null).commit() ),则会导致崩溃。

Instead, tag the fragment that you're adding (make an AD_FRAGMENT_TAG and use .add(id, new AdvertisingFragment(), AD_FRAGMENT_TAG) ) and whenever you want to use it, look it up with getSupportFragmentManager().findFragmentByTag(AD_FRAGMENT_TAG) and make sure it's non-null before doing transactions with it. 而是标记要添加的片段(制作一个AD_FRAGMENT_TAG并使用.add(id, new AdvertisingFragment(), AD_FRAGMENT_TAG) ),并在每次使用时使用getSupportFragmentManager().findFragmentByTag(AD_FRAGMENT_TAG)然后在使用它进行交易之前,请确保它不为空。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM