2014-08-27 51 views
0

我的應用程序在很長一段時間內發生NullPointerException異常的情況已經最小化。我認爲問題出在碎片的組織上。Android NullPointerException當我的應用程序長時間最小化時

這裏是日誌貓:

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)= 

和一塊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; 
    } 
} 

}

+0

瞭解如何提問http://stackoverflow.com/help/how-to-ask儘量讓代碼更具可讀性。 – afzalex 2014-08-27 21:40:59

+0

stacktrace說NPE在哪裏。 – 2014-08-27 21:51:57

+0

谷歌「如何讀取堆棧跟蹤」...第一個命中之一是一個很好的SO線程。 – 2014-08-27 22:13:45

回答

0

是的,你的問題是,你保持長期參照FragmentadvFragment,並儘快爲您Activity被殺害(由於Android的回收內存或配置更改)。如果您提交空值Fragment參考的交易(例如.show(null).commit()),則會導致該崩潰。

相反,標記您要添加(做出AD_FRAGMENT_TAG和使用.add(id, new AdvertisingFragment(), AD_FRAGMENT_TAG)),只要你想使用它,用getSupportFragmentManager().findFragmentByTag(AD_FRAGMENT_TAG)看看它並確保它是用它做交易之前,非空的片段。

相關問題