2012-08-30 14 views
0

我遇到了android碎片的問題。NPE會拋出,如果我嘗試通過意圖訪問片段

如果我通過Intent調用Actitiy A並且之前啓動了Actitiy,它就可以工作。 在另一種情況下,如果我通過Intent調用Actitiy A並且Actitiy是而不是之前開始的,那麼將會拋出NullPointerException,如果我嘗試獲取片段對象。

我必須訪問片段,但如果活動未運行,我得到了NPE。

Code活動內剪斷:

public class HomeActivity extends BaseFragmentActivity { 

@Override 
protected void onNewIntent(Intent intent) { 
     if (intent.hasExtra("tab")) { 
      int tab = intent.getIntExtra("tab", 0); 
      mTabsHelper.setTab(tab); 
      if (intent.hasExtra("id")) { 
       String tickerName = intent.getStringExtra("id"); 
       switchToExistTicker(tickerName); 
      } 
     } 
    } 

    private TickerListFragment getTickerListFragment() { 
     TickerListFragment tickerListFragment = (TickerListFragment) getSupportFragmentManager() 
        .findFragmentByTag("android:switcher:2131099811:1"); 
     return tickerListFragment; 
    } 

    private void switchToNewTicker(String name) { 
     getTickerListFragment().setNewTicketName(name); 
    } 

    private void switchToExistTicker(String name) { 
     getTickerListFragment().switchToTicker(getTickerListFragment().getTickerIdForTickerName(name), true); 
    } 
} 

在其他活動,這是reponsibel用於經由通知發送意圖,下面的代碼剪斷:

protected void sendnotification (String title, String message) { 
    Intent i = new Intent("android.intent.action.MAIN"); 
    i.setComponent(new ComponentName("de.domain.android", "de.domain.android.HomeActivity")); 
    i.putExtra("tab", 1); 
    i.putExtra("id", "subject"); 
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
       | Intent.FLAG_ACTIVITY_NEW_TASK); 

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, i, 0); 

    Notification n = new Notification(R.drawable.ic_launcher, message, System.currentTimeMillis()); 
    n.flags = Notification.FLAG_AUTO_CANCEL; 
    n.setLatestEventInfo(getApplicationContext(), title, message, contentIntent); 

    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
    manager.notify(0, n); 
} 

通知被髮送之後,將用戶觸摸通知以打開活動A.活動A以特定的附加形式接收意圖(有關更多詳細信息,請參閱附加的代碼片段)。如前所述,如果活動A之前未啓動,則活動會崩潰,因此他們必須重新開始活動。在這種情況下,所需的Fragment找不到,「null」是返回值 - NullPointerException是結果。 也如上所述,如果活動之前開始活動不會崩潰 - 然後它的工作。

繼例外股票:

8805   AndroidRuntime E FATAL EXCEPTION: main 
    8805   AndroidRuntime E java.lang.RuntimeException: Unable to start activity ComponentInfo{de.domain.android/de.domain.android.HomeActivity}: java.lang.NullPointerException 
    8805   AndroidRuntime E at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202) 
    8805   AndroidRuntime E at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237) 
    8805   AndroidRuntime E at android.app.ActivityThread.access$600(ActivityThread.java:139) 
    8805   AndroidRuntime E at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
    8805   AndroidRuntime E at android.os.Handler.dispatchMessage(Handler.java:99) 
    8805   AndroidRuntime E at android.os.Looper.loop(Looper.java:154) 
    8805   AndroidRuntime E at android.app.ActivityThread.main(ActivityThread.java:4974) 
    8805   AndroidRuntime E at java.lang.reflect.Method.invokeNative(Native Method) 
    8805   AndroidRuntime E at java.lang.reflect.Method.invoke(Method.java:511) 
    8805   AndroidRuntime E at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    8805   AndroidRuntime E at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    8805   AndroidRuntime E at dalvik.system.NativeStart.main(Native Method) 
    8805   AndroidRuntime E Caused by: java.lang.NullPointerException 
    8805   AndroidRuntime E at de.domain.android.HomeActivity.switchToExistTicker(HomeActivity.java:144) 
    8805   AndroidRuntime E at de.domain.android.HomeActivity.onNewIntent(HomeActivity.java:127) 
    8805   AndroidRuntime E at de.domain.android.HomeActivity.onCreate(HomeActivity.java:94) 
    8805   AndroidRuntime E at android.app.Activity.performCreate(Activity.java:4538) 
    8805   AndroidRuntime E at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
    8805   AndroidRuntime E at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158) 
    8805   AndroidRuntime E ... 11 more 

任何幫助和建議將不勝感激!

問候!

回答

0

你NPE記錄帶班na行,如堆棧跟蹤告訴:

... at de.domain.android.HomeActivity.switchToExistTicker(HomeActivity.java:144) 

因爲你沒有提供的代碼,你必須檢查你的HomeActivity.java線144,看你即不嘗試訪問在某些情況下可能爲空的對象。無論如何,在那裏種植一個斷點並進行調試。 W/o相關的來源我不能給更多詳細的指針。

+0

144行中的代碼是方法調用「switchToExistTicker」中的單行 - 我已經嘗試過使用斷點解決它並在調試mdoe中運行。但是,只要144行被執行,應用程序就會崩潰。正如庫存跟蹤所示,結果片段爲空(NPE)。如果應用程序之前已經啓動,則不會發生這種情況。 爲什麼片段爲空如果應用程序將開始新的和爲什麼片段不爲null如果應用程序已經運行? –

相關問題